DataGrid行和MVVM

时间:2010-05-18 06:06:04

标签: c# .net wpf silverlight mvvm

我有一个包含很多行的wpf数据网格,每行都有一些特定的行为,例如第1列的选择更改将过滤第2列组合,第1行第1列中选择的内容在第2行第1列中无法选择等等......

所以我想为主数据网格创建一个视图模型,并为每一行创建另一个模型。

这是一个很好的MVVM实现吗?这样我才能有效地处理每一行的变更事件。

问题是,如何创建“每一行”作为用户控件视图?在datagrid中。

我想实现这样的事情:

        <TreeView
        Padding="0,4,12,0">

        <controls:CommandTreeViewItem
            Header="Sales Orders"
            Command="{Binding SelectViewModelCommand}"
            CommandParameter="Sales Orders"/>          

    </TreeView>  

而不是TreeView我需要一个数据网格,而不是控件:CommandTreeViewItem是WPF中的数据网格行。

提前致谢。

3 个答案:

答案 0 :(得分:1)

        <my:DataGrid x:Name="locationGrid">
            <my:DataGrid.Columns>
                <my:DataGridTemplateColumn>
                    <my:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Path=LocationName}"/>
                        </DataTemplate>
                    </my:DataGridTemplateColumn.CellTemplate>
                    <my:DataGridTemplateColumn.CellEditingTemplate>
                            <DataTemplate>
                            <TextBox Text="{Binding Path=LocationName}"/>
                        </DataTemplate>
                    </my:DataGridTemplateColumn.CellEditingTemplate>
                </my:DataGridTemplateColumn>
            </my:DataGrid.Columns>
        </my:DataGrid>    

您几乎可以随意放入每个DataGrid列。我在这里举了你的例子。您可以定义偶数标题模板。如果你制作小程序就不需要MVVM,但我不太清楚为什么你需要MV for DataGridRow?创建UserControl并将其嵌入到DataTemplate中,并为UserControl创建VM类。

答案 1 :(得分:0)

您可以为每一行使用DataTemplate,并按照您需要的方式对其进行自定义。

答案 2 :(得分:0)

只需在viewModel的公共属性中为视图创建视图模型类的可观察集合。这是一个例子

public ObservableCollection<YourViewModelForEachRow> LineItems{ get; private set; }

然后在您的视图中,datagrid xaml会将ItemsSource属性设置为您在上面创建的LineItems属性。

ItemSource="{Binding LineItems"}

这当然假设包含DataGrid的视图的DataContext已设置为您创建LineItems的ViewModel。我这样做是为了我的观点。我仍然认为自己是WPF的新手,但这似乎是一种非常干净和灵活的MVVM方法。用于处理每行上的数据输入,窗口小部件处理等的所有逻辑由行视图模型处理。

另外你的xaml非常干净。我的典型列定义如下所示(其中LineItemNumber是我的LineItemViewModel上的公共属性):

<DataGridTextColumn Binding="{Binding Path=LineItemNumber, StringFormat=000}"
                              ElementStyle="{StaticResource CellRightAlign}"
                              Header="Line No." />