2011-06-15 121 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

相關問題