如何使用MVVM处理数据网格单元更改?

时间:2011-06-15 13:48:58

标签: wpf mvvm

我正在试图弄清楚如何在保持MVVM设计模式的同时处理数据网格单元中的更改。当用户更改单元格中的值时,我必须根据新单元格值关闭并更改一堆文件。我知道如何通过代码隐藏来轻松实现这一点,但是有更清晰,更MVVM的方式来执行命令绑定吗?

2 个答案:

答案 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