如何创建一个可以显示不同类型对象的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列的属性的。
我想提出两种可能的解决方案。
解决方案A:创建特定于显示器的视图模型
与其将不同的图形对象绑定到网格,不如创建一个专门用于数据显示的单独视图模型。然后,您可以使用不同的图形对象初始化此视图模型。在网格中,您可以始终绑定到与DataGrid
的列相匹配的显示特定视图模型的属性。
这本质上就是MVVM的目的,视图模型充当视图和模型之间的一层。在您的情况下,模型是图形对象,视图模型将它们包装起来以在视图中显示。
这种方法的想法也是将复杂性从视图(xaml)转移到视图模型,以避免复杂的xaml定义。
解决方案B:使用ListBox
而不是DataGrid
和ItemTemplateSelector
本教程演示如何将ItemTemplateSelector与ListView
控件结合使用:如何使用DataTemplateSelector根据数据切换模板
这里的想法是为特定绑定的源类型选择合适的DataTemplate
。
您写下要使用DataGrid
。我不确定是否可以将ItemTemplateSelector
与DataGrid
一起使用,因为这样您就需要在DataTemplate
中创建一个行对象,我不知道如何实现这一点。
但我更喜欢解决方案A.