如何使用MVVM处理数据网格单元格更改?
问题描述:
我想弄清楚如何在保持MVVM设计模式的同时处理数据网格单元格中的更改。当用户更改单元格中的值时,必须根据新的单元格值更改一堆文件。我知道我可以如何轻松地在代码背后做到这一点,但有没有更清晰,更MVVM的方式来做到这一点与命令绑定?如何使用MVVM处理数据网格单元格更改?
答
让我们假设你的DataGrid
的ItemsSource
必然,TwoWay
- 模式,以东西在你的ViewModel
,姑且称之为CustomObject
或什么的。
那么,让我们假设一个特定DataGridCell
被绑定到一个名为SomeProperty
属性,其声明如下:
private string someProperty;
public string SomeProperty {
get { return someProperty; }
set {
someProperty = value;
//Fire OnPropertyChanged here
}
}
将断点只是在集。然后,修改视图中的单元格:将达到断点。
这允许你模拟一个事件:每次调用这个集合,这意味着单元格将会改变,随着改变的过程做任何你想要的事情(例如你可以测试新的值,通过测试value
,或保留最后一个值,通过在行someProperty = value;
)
答
通常我会用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());
这看起来不正确的做法对我来说。通常,网格将绑定到ViewModel中的某个集合对象,并且'CustomObject'将在您的模型中定义。你不能在那里做这样的操作。 另外,用户编辑不是唯一会改变模型对象属性的东西。 – 2016-10-13 13:12:10