2

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

TheModel{
  instanceOfClassA
}

ClassA{
  someProps
  Dictionary<string, classB>
}

ClassB{
  someOtherProps
  Dictionary<string, classC>
}

ClassC{
  someMoreProps
}

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

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

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

谢谢菲利普。

4

1 回答 1

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 行

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

在 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}">
于 2013-04-12T14:58:42.090 回答