我有一个包含很多行的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中的数据网格行。
提前致谢。
答案 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." />