具有可变列数的DataGrid中的WPF数据绑定

时间:2017-07-30 11:51:45

标签: c# wpf xaml datagrid

在我的WPF应用程序中,我将数据绑定到DataGrid。我们说我有一个班级

public MyRowData
{
    public int Id { get; set; }
    public int string Description { get; set; }
    public CustomClass1 SomeData1 { get; set; }
    public List<CustomClass2> SomeDataList2 { get; set; }
}

此类表示DataGrid中的一行。我的DataGrid列数可变,具体取决于SomeDataList2列表的长度。

在我的ViewModel中,我目前拥有属性

public ObservableCollection<DataGridColumn> MyColumnCollection { get; set; }
public List<MyRowData> MyTable { get; set; }

在我的XAML文件中,我有

<DataGrid IsReadOnly="True"
          ItemsSource="{Binding MyTable, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"
          viewmodel:DataGridColumnsBehavior.BindableColumns="{Binding MyColumnCollection}"
          AutoGenerateColumns="False" />

其中viewmodel:DataGridColumnsBehavior.BindableColumns是建议here的类。

MyColumnCollection包含一些DataGridColumn个对象,例如

new DataGridTextColumn()
{
    Header = "Id",
    Binding = new Binding("Id")
    {
        Converter = myConverter // some converter I defined earlier
    },
    CanUserSort = false,
    CanUserReorder = false,
    CellStyle = cellStyleDefault, // some style I defined earlier
    ElementStyle = elementStyleRight, // some style I defined earlier
    HeaderStyle = headerStyleRight // some style I defined earlier
};

当然,我还为我需要的其他每个列添加DataGridColumn,即DescriptionSomeData1以及SomeDataList2中的每个元素。

到目前为止这种方法完全正常。但我发现在我的ViewModel中设置样式(CellStyleElementStyleHeaderStyle)有点奇怪。我希望在我的视图中设置这些样式(在XAML文件中)。

我找到了很多关于如何在XAML文件中设置样式的示例,但是到目前为止我发现的所有内容都假设相同的样式应用于所有列。但是,在我的情况下,string个对象,CustomClass1个对象和CustomClass2应使用不同的样式。

现在我的第一个问题是: XAML是否有办法测试对象的类型,并根据类型应用不同的样式?

我使用的样式也使用绑定到某些属性的触发器。例如,我使用

DataTrigger myTrigger = new DataTrigger()
{
    Binding = new Binding("SomeDataList2[" + index + "].SomePropteryOfCustomClass2"),
    Value = true
};

并将此DataTrigger应用于用于显示对象SomeDataList2[index]的样式。因为我在绑定名称中使用索引,所以我不确定如何在XAML中编写这样的绑定。

现在我的第二个问题是:有没有办法用XAML中的索引编写绑定,以便SomeDataList2中的每个对象(其中index为此列表中的对象索引)可以在触发器中使用绑定到SomeDataList2[" + index + "].SomePropteryOfCustomClass2吗?

0 个答案:

没有答案