WPF动态DataGrid绑定值从嵌套对象从集合到自定义DataGridCell模板

时间:2014-09-29 22:13:29

标签: c# .net wpf xaml mvvm

我花了半天多的时间来完成这项任务,对于一棵树,我看不到森林。

目的是将数据(DataGrid)按顺序显示为具有动态列数的多个网格,其中每个单元格(不仅仅是列)可以通过双向绑定进行编辑或不可编辑。

我想避免使用代码隐藏方法,我相信xaml可以为我提供我需要的东西。其他的是mvvm注射。

让我们简单一点,先为一个表做绑定。

我的第一个难点是创建DataTable,但这不能用于单元格可编辑级别。然后我创建了对象集合的集合(对于一个表 - >多行 - >多列)。

public class DataGridCell : BaseViewModel
{     
    public string Value
     ....
    public bool IsEditable
     ....     

}

然后我有另一个代表一个表(网格)的VM,其中包含VM

public class DataGridItem : BaseViewModel
{    
    public string TableName
    {
     ....
    }

    public ObservableCollection<ObservableCollection<DataGridCell>> Data
    {
     ....
    }
}

然后我的xaml看起来像这样

<DataGrid ItemsSource="{Binding Path=Data}" AutoGenerateColumns="True">
    <DataGrid.Resources>

        <DataTemplate x:Key="ReadonlyCellTemplate">
            <TextBlock Text="{Binding Value}" />
        </DataTemplate>

        <DataTemplate x:Key="EditableCellTemplate">
            <TextBox Text="{Binding Value}" />
        </DataTemplate>

    </DataGrid.Resources>
    <DataGridTemplateColumn CellTemplate="{StaticResource ReadonlyCellTemplate}">
        <DataGridTemplateColumn.CellEditingTemplate>
            <DataTemplate>

                <ContentPresenter x:Name="Presenter" ContentTemplate="{StaticResource ReadonlyCellTemplate}" />
                <DataTemplate.Triggers>                             

                    <DataTrigger Binding="{Binding IsEditable, PresentationTraceSources.TraceLevel=High}" Value="True">
                        <Setter TargetName="Presenter" Property="ContentTemplate" Value="{StaticResource EditableCellTemplate}" />
                    </DataTrigger>

                </DataTemplate.Triggers>
            </DataTemplate>
        </DataGridTemplateColumn.CellEditingTemplate>
    </DataGridTemplateColumn>
</DataGrid>

这个想法是动态选择数据输入控件将填充哪个单元格,哪些不是。 问题具有约束力。我无法弄清楚如何绑定集合中的具体单元格元素。

感谢您提供任何可能的建议

1 个答案:

答案 0 :(得分:0)

我希望现在还为时不晚,但这就是我解决将细胞与动态数据绑定的问题:

Problems binding to a the content of a WPF DataGridCell in XAML

(根据要求添加代码)