我正在试图弄清楚如何在保持MVVM设计模式的同时处理数据网格单元中的更改。当用户更改单元格中的值时,我必须根据新单元格值关闭并更改一堆文件。我知道如何通过代码隐藏来轻松实现这一点,但是有更清晰,更MVVM的方式来执行命令绑定吗?
答案 0 :(得分:12)
通常我会使用Galasoft的交互触发器来执行此操作。
<DataGrid IsReadOnly="False">
<e:Interaction.Triggers>
<e:EventTrigger EventName="CellEditEnding">
<GalaSoft_MvvmLight_Command:EventToCommand PassEventArgsToCommand="True" Command="{Binding CellEditEndingCommand}"/>
</e:EventTrigger>
</e:Interaction.Triggers>
<DataGrid.Columns>
...
</DataGrid.Columns>
</DataGrid>
然后在ViewModel中创建泛型RelayCommand,其中泛型类型是相应EventArgs的类型。
RelayCommand<DataGridCellEditEndingEventArgs> CellEditEndingCommand {get; set;}
初始化:
CellEditEndingCommand = new RelayCommand<DataGridCellEditEndingEventArgs>(args=>DoSomething());
答案 1 :(得分:2)
我们假设您的DataGrid
ItemsSource
绑定TwoWay
- 模式,绑定到ViewModel
中的内容,我们称之为CustomObject
或其他内容。
然后假设特定的DataGridCell
绑定到名为SomeProperty
的属性,其声明如下:
private string someProperty;
public string SomeProperty {
get { return someProperty; }
set {
someProperty = value;
//Fire OnPropertyChanged here
}
}
在集合上放置一个断点。然后,修改视图中的单元格:将到达断点。
这允许您模拟一个事件:每次调用该集合时,都意味着该单元格将会发生变化,通过更改过程执行您想要的任何操作(例如,您可以通过在{{上进行测试来测试新值) 1}},或保留最后一个值,方法是在value
行之前的某处保存someProperty