【问题标题】:xaml DataGrid bind to dictionary in dictionary in dictionaryxaml DataGrid 绑定到字典中的字典
【发布时间】:2013-04-12 13:04:38
【问题描述】:

我想将 xaml DataGrid 绑定到包含类似内容的模型:

TheModel{
  instanceOfClassA
}

ClassA{
  someProps
  Dictionary<string, classB>
}

ClassB{
  someOtherProps
  Dictionary<string, classC>
}

ClassC{
  someMoreProps
}

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

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

有我可以使用的 xaml 元素吗?

谢谢 菲利普。

【问题讨论】:

    标签: c# xaml dictionary datagrid


    【解决方案1】:

    我认为您需要将数据表示为 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类第1行 - B 类第 1 排 - C类第1行 - C类第2行 - C 类 N 行 - B 类第 2 排 - C类第1行 - C类第2行 - C 类 N 行 - B 类 N 行 C类第1行 C类第2行 C 类 N 行 - A类第2行 - B 类第 1 排 - C类第1行 - C类第2行 - C 类 N 行 - B 类第 2 排 - C类第1行 - C类第2行 - C 类 N 行 - B 类 N 行 C类第1行 C类第2行 C 类 N 行 - A 级 N 行 - B 类第 1 排 - C类第1行 - C类第2行 - C 类 N 行 - B 类第 2 排 - C类第1行 - C类第2行 - C 类 N 行 - B 类 N 行 C类第1行 C类第2行 C 类 N 行

    如果您想要展开/折叠功能,请查看此链接。

    Displaying hierarchal parent child data in WPF DataGrid

    如果您有权访问基础设施控件,我强烈建议您使用 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}">
    

    【讨论】:

    • 嗯,我不想添加或显示 RowDetails.. 我只想将我的数据层次结构扁平化为一个 DataGrid。
    • 更新了答案以包含有关如何转换和显示平面数据的信息。
    猜你喜欢
    • 2017-08-28
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 2021-05-29
    相关资源
    最近更新 更多