在绑定期间将子集合显示为列

时间:2012-01-06 17:12:08

标签: c# .net wpf mvvm

我有一个对象(Entity)的集合,其中包含一个子集合(Result是Double [])。

我想在DataGrid(或其他控件)中显示我的实体(实体)集合,我想在同一行显示我的子集合(我的子集合中的每个值对应一列)

前[编辑]:

Entity name | Entity Value | Result1 | Result2 | ... | Result n
_______________________________________________________________
My Name     | MyValue      | 1       | 2       | ... | 3
My Name II  | other Value  | 10%     | 20%     | ... | 30%

我实际上使用的是基于此thread中描述的ICustomTypeDescriptor和PropertyDescriptor的解决方案,但它不合适,因为我们想要编辑DataGrid中的值,并且维护和进化也非常复杂。

1 个答案:

答案 0 :(得分:1)

如果您有静态的Result项,那么您可以关闭AutoGenerateColumns并定义自己的绑定到这些值的列

<DataGrid AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Name}" />
        <DataGridTextColumn Binding="{Binding Value}" />
        <DataGridTextColumn Binding="{Binding Results[1]}" />
        <DataGridTextColumn Binding="{Binding Results[2]}" />
        ....
    </DataGrid.Columns>
</DataGrid>

如果您有动态金额,则可以使用DataGridTemplateColumn并以ItemsControl

之类的方式显示您的子集
<DataGrid AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Name}" />
        <DataGridTextColumn Binding="{Binding Value}" />
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.ItemTemplate>
                <DataTemplate>
                    <ItemsControl ItemsSource="{Binding Results}">
                        <ItemsControl.ItemsPanel>
                            <ItemsPanelTemplate>
                                <StackPanel Orientation="Horizontal" />
                            </ItemsPanelTemplate>
                        </ItemsControl.ItemsPanel>
                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                <TextBox Width="50" Value="{Binding }" />
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>
                </DataTemplate>
            </DataGridTemplateColumn.ItemTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>