DataGrid绑定到字典中的字典中的字典

本文关键字:字典 绑定 DataGrid | 更新日期: 2023-09-27 18:08:55

我想将一个xaml DataGrid绑定到一个包含如下内容的模型:

TheModel{
  instanceOfClassA
}
ClassA{
  someProps
  Dictionary<string, classB>
}
ClassB{
  someOtherProps
  Dictionary<string, classC>
}
ClassC{
  someMoreProps
}

这意味着在DataGrid中,在ClassA中的ClassB中的每个ClassC将有一行,其中的列包含所有三个字典的数据。

我不想在模型中实现一个TOList方法,因为这会破坏模型和视图之间的分离。

是否有一个我可以使用的xaml元素?

谢谢菲利普。

DataGrid绑定到字典中的字典中的字典

我认为您需要将数据表示为DataGrid中的分层行。你可以这样做。

<DataGrid AutoGenerateColumns="False"
          ItemsSource="{Binding Data}"
          RowDetailsVisibilityMode="Visible">
  <DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding P1}" />
    <DataGridTextColumn Binding="{Binding P2}" />
  </DataGrid.Columns>
  <DataGrid.RowDetailsTemplate>
    <DataTemplate>
      <DataGrid AutoGenerateColumns="False"
                ItemsSource="{Binding DictionaryInA.Values}"
                RowDetailsVisibilityMode="Visible">
        <DataGrid.RowDetailsTemplate>
          <DataTemplate>
            <DataGrid AutoGenerateColumns="False"
                      ItemsSource="{Binding DictionaryInB.Values}">
              <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding P1}" />
                <DataGridTextColumn Binding="{Binding P2}" />
              </DataGrid.Columns>
            </DataGrid>
          </DataTemplate>
        </DataGrid.RowDetailsTemplate>
        <DataGrid.Columns>
          <DataGridTextColumn Binding="{Binding P1}" />
          <DataGridTextColumn Binding="{Binding P2}" />
        </DataGrid.Columns>
      </DataGrid>
    </DataTemplate>
  </DataGrid.RowDetailsTemplate>
</DataGrid>

你的数据看起来像这样。

<>之前- A类- B类- C类- C类第二排—C类,第N行- B类第二排- C类- C类第二排—C类,第N行- B类,第N排C类第一排C类第二排C类第N行- A类第二排- B类- C类- C类第二排—C类,第N行- B类第二排- C类- C类第二排—C类,第N行- B类,第N排C类第一排C类第二排C类第N行- A类第N行- B类- C类- C类第二排—C类,第N行- B类第二排- C类- C类第二排—C类,第N行- B类,第N排C类第一排C类第二排C类第N行之前

如果你想要展开/折叠功能,看看这个链接。

在WPF DataGrid中显示层次化的父、子数据

如果您可以访问fragistics控件,我强烈建议您使用XamDataGrid而不是. net DataGrid。你几乎可以用这个控件做任何你想做的事情。

http://www.infragistics.com/products/wpf/data-grid/

更新

对于平面数据,您可以像这样为模型创建包装器。

public IEnumerable FlattenedModel
{
    get
    {
        return (from b in TheModel.InstanceOfClassA.DictionaryInA.Values
                from c in b.DictionaryInB.Values
                select new
                {
                    PropertyA1 = TheModel.PropertyA1,
                    PropertyA2 = TheModel.PropertyA2,
                    PropertyB1 = b.PropertyB1,
                    PropertyB2 = b.PropertyB2,
                    PropertyC1 = c.PropertyC1,
                    PropertyC2 = c.PropertyC2
                }).ToList();
    }
}

如果不能使用包装器,也可以使用转换器。

public class FlattenTheModelConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var InstanceOfTheModel = value as TheModel;
        return (from b in InstanceOfTheModel.InstanceOfClassA.DictionaryInA.Values
                from c in b.DictionaryInB.Values
                select new
                {
                    PropertyA1 = InstanceOfTheModel .PropertyA1,
                    PropertyA2 = InstanceOfTheModel .PropertyA2,
                    PropertyB1 = b.PropertyB1,
                    PropertyB2 = b.PropertyB2,
                    PropertyC1 = c.PropertyC1,
                    PropertyC2 = c.PropertyC2
                }).ToList();
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

如果您决定使用转换器,则需要按如下方式修改XAML。

<DataGrid ItemsSource="{Binding TheModel, Converter={StaticResource FlattenTheModelConverter}, Mode=OneWay}">