如何创建一个可以显示不同类型对象的C#WPF数据网格

本文关键字:对象 同类型 C#WPF 数据网 数据 显示 网格 创建 何创建 一个 | 更新日期: 2023-09-27 18:20:50

我刚开始学习C#,正试图使用MVVM原理创建一个WPF应用程序,但我对数据绑定和数据网格的工作方式有点困惑。基本上现在我有一个简单的应用程序,它可以执行以下操作:

  • 我有一个实现IGraphType接口的GraphType1对象和GraphType2对象
  • GraphType1和GraphType2对象分别包含GraphType1Series和GraphType2Series对象的ObservableCollection,它们实现了IGraphTypeSeries接口
  • 我有一个ListBox,可以添加和删除IGraphType对象。选择IGraphType对象时,它将变为CurrentGraphObject
  • 我有一个DataGrid,它显示CurrentGraphObject的IGraphTypeSeries的集合

我的问题是,我如何设置DataGrid,使DataGrid列反映当前所选IGraphType的IGraphTypeSeries的属性,无论它是GraphType1Series还是GraphType2Series,因为这两个列将具有不同的属性?我没有使用AutoGenerateColumn=true,因为我希望其中一列是其中一个属性的组合框列。

下面是我当前的DataGrid代码。它有两列绑定到IGraphTypeSeries对象的MachineName和MetricName属性。但并非所有IGraphTypeSeries都具有这些属性。我不知道如何创建数据网格,以便根据用户在ListBox中选择的CurrentGraphObject的类型更改列和列绑定。

<DataGrid Margin="0,0,0,0" AutoGenerateColumns="False" CanUserDeleteRows="True" CanUserAddRows="True" ItemsSource="{Binding Path=CurrentGraphObject.SeriesList}">
            <DataGrid.Columns>
                <DataGridTextColumn  Header="Machine Name" IsReadOnly="False" Binding="{Binding MachineName}">
                </DataGridTextColumn>
                <DataGridComboBoxColumn
                    Header="Metric Name"
                    ItemsSource="{DynamicResource MetricObjects}"
                    SelectedValueBinding="{Binding MetricName}"
                    SelectedValuePath="Path"
                    DisplayMemberPath="Alias"
                    >
                </DataGridComboBoxColumn>
            </DataGrid.Columns>
        </DataGrid>

我不确定是否需要为每个Graph Type创建单独的视图或数据网格,也不确定是否可以编辑此DataGrid。我试着使用DataTrigger,但我不知道sytax是如何让DataTrigger编辑DataGrid列的属性的。

如何创建一个可以显示不同类型对象的C#WPF数据网格

我想提出两种可能的解决方案。

解决方案A:创建特定于显示器的视图模型

与其将不同的图形对象绑定到网格,不如创建一个专门用于数据显示的单独视图模型。然后,您可以使用不同的图形对象初始化此视图模型。在网格中,您可以始终绑定到与DataGrid的列相匹配的显示特定视图模型的属性。

这本质上就是MVVM的目的,视图模型充当视图和模型之间的一层。在您的情况下,模型是图形对象,视图模型将它们包装起来以在视图中显示。

这种方法的想法也是将复杂性从视图(xaml)转移到视图模型,以避免复杂的xaml定义。


解决方案B:使用ListBox而不是DataGridItemTemplateSelector

本教程演示如何将ItemTemplateSelector与ListView控件结合使用:如何使用DataTemplateSelector根据数据切换模板

这里的想法是为特定绑定的源类型选择合适的DataTemplate

您写下要使用DataGrid。我不确定是否可以将ItemTemplateSelectorDataGrid一起使用,因为这样您就需要在DataTemplate中创建一个行对象,我不知道如何实现这一点。

但我更喜欢解决方案A.