2011-06-15 123 views
5

我想弄清楚如何在保持MVVM设计模式的同时处理数据网格单元格中的更改。当用户更改单元格中的值时,必须根据新的单元格值更改一堆文件。我知道我可以如何轻松地在代码背后做到这一点,但有没有更清晰,更MVVM的方式来做到这一点与命令绑定?如何使用MVVM处理数据网格单元格更改?

回答

2

让我们假设你的DataGridItemsSource必然,TwoWay - 模式,以东西在你的ViewModel,姑且称之为CustomObject或什么的。

那么,让我们假设一个特定DataGridCell被绑定到一个名为SomeProperty属性,其声明如下:

private string someProperty; 
public string SomeProperty { 
    get { return someProperty; } 
    set { 
    someProperty = value; 
    //Fire OnPropertyChanged here 
    } 
} 

将断点只是在集。然后,修改视图中的单元格:将达到断点。

这允许你模拟一个事件:每次调用这个集合,这意味着单元格将会改变,随着改变的过程做任何你想要的事情(例如你可以测试新的值,通过测试value ,或保留最后一个值,通过在行someProperty = value;

+0

这看起来不正确的做法对我来说。通常,网格将绑定到ViewModel中的某个集合对象,并且'CustomObject'将在您的模型中定义。你不能在那里做这样的操作。 另外,用户编辑不是唯一会改变模型对象属性的东西。 – 2016-10-13 13:12:10

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

+1之前的某处保存someProperty +1,因为这通常是实现它的方法,尽管您不必使用Galasoft的版本。 PRISM还可以将事件绑定到VM命令,或者您可以找到自定义实施,例如http://marlongrech.wordpress.com/2008/12/04/attachedcommandbehavior-aka-acb/ – Rachel 2011-06-15 14:22:31

+0

或者您可以创建一个基于DelegateCommand在CellEditEnding事件 – skjagini 2012-09-27 20:42:01

相关问题