如何将自定义列类型添加到wpf数据网格?
我目前有一个绑定的datagrid,它正在自动生成列如何将自定义列类型添加到wpf数据网格?,wpf,datagrid,wpf-controls,Wpf,Datagrid,Wpf Controls,我目前有一个绑定的datagrid,它正在自动生成列 <DataGrid x:Name="dataGrid" ItemsSource="{Binding TestRows}" HeadersVisibility="All" GridLinesVisibility="Vertical&quo
<DataGrid x:Name="dataGrid"
ItemsSource="{Binding TestRows}"
HeadersVisibility="All"
GridLinesVisibility="Vertical"
BorderBrush="Gray"
BorderThickness="5"
IsReadOnly="False"
CanUserResizeColumns="False"
CanUserSortColumns = "True"
HorizontalScrollBarVisibility="Visible"
VerticalScrollBarVisibility="Visible"
SelectionMode="Single"
AutoGenerateColumns="True"
AutoGeneratingColumn="dataGrid_AutoGeneratingColumn">
...
...
...
</DataGrid>
...
...
...
自动生成对字符串和整数非常有效,但我在数据集合中的项上还有一个Dictionary
类型的对象。字典对TestRows
中的每个项目都有相同的键,但内容不同
我希望datagrid为字典中的每个键动态添加一个自定义的DataGridTemplateColumn
,使用值中的特定属性作为单元格值。我怀疑我可以在dataGrid\u AutoGeneratingColumn
中为此添加一些内容,但我找不到这样做的方法
我如何才能实现上述目标
TestRows是对象的ObservableCollection,集合中每个对象有一行。数据网格会自动为对象中的每个字符串和int生成一列,这就是我想要的。然而,我在对象中也有一个字典。字典在TestRows中的每个对象中都有相同的键,但我不知道这些键在运行时之前是什么
AutoGeneratingColumn
是在设置了ItemsSource
之后引发的,这样您就可以处理AutoGeneratingColumn
如下:
private void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
if (e.PropertyName == nameof(YourClass.YourDictionaryPropertyName))
{
e.Cancel = true;
DataGrid dataGrid = (DataGrid)sender;
IList sourceCollection = dataGrid.ItemsSource as IList;
MyClass firstItem = sourceCollection?[0] as MyClass;
foreach (var key in firstItem.YourDictionaryPropertyName.Keys)
{
dataGrid.Columns.Add(new DataGridTextColumn { Header = "...", Binding = new Binding($"{nameof(YourClass.YourDictionaryPropertyName)}"[{key}]") });
}
}
}
…其中,YourClass
是“TestRows”中的一项:
公共类您的类
{
公共词典YourDictionaryPropertyName{get;}
...
}
对于哪个词典中的每个键?所有行只有一列,但每行都有一个dictionary属性,不是吗?那么您指的是哪个词典呢?TestRows是一个对象的ObservableCollection,集合中每个对象有一行。数据网格会自动为对象中的每个字符串和int生成一列,这就是我想要的。然而,我在对象中也有一个字典。字典在TestRows中的每个对象中都有相同的键,但我不知道这些键在运行时之前是什么。我想基于此字典动态生成列。
public class YourClass
{
public Dictionary<string, string> YourDictionaryPropertyName { get; }
...
}