我正在使用Galasoft MVVM Light。我有一個DataGrid,它有四列,總金額,增值稅率,增值稅金額和淨金額。當用戶更改其中一個值時,我需要重新計算其他三個值。我有一箇中繼命令附加到DataGrid的CellEditEnding事件來激活執行計算的ViewModel中的代碼。但是我需要知道爲了正確進行計算而改變了哪個值。如何在XAML中指定哪個列/單元觸發了該事件,即如何將命令參數綁定到觸發列/單元的名稱?XAML將命令參數綁定到DataGrid列名
<DataGrid
....>
<i:Interaction.Triggers>
<i:EventTrigger EventName="CellEditEnding">
<mvvm:EventToCommand Command="{Binding CalculateAusgabe_Command,
Mode=OneWay,
UpdateSourceTrigger=PropertyChanged,
diag:PresentationTraceSources.TraceLevel=High}"
CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridTextColumn}}, Path=Name}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</DataGrid>
在視圖模型的代碼是:
public RelayCommand<string> CalculateAusgabe_Command { get; set; }
...
CalculateAusgabe_Command = new RelayCommand<string>(CalculateAusgabe);
最後,做計算的過程:
void CalculateAusgabe(string colName)
{
if (currBetrag.USt == null) return;
switch (colName)
{
case "colBetBtto":
case "colBetUStS":
if (currBetrag.BttoBetrag != 0M)
{
currBetrag.UStBetrag = Math.Round((currBetrag.BttoBetrag/(100M + currBetrag.USt.UStProz)) * currBetrag.USt.UStProz, 2);
currBetrag.NttoBetrag = currBetrag.BttoBetrag - currBetrag.UStBetrag;
}
break;
case "colBetUStB":
...
數據網格的當前行被綁定到currBetrag
對象。一切正常,CalculateAusgabe
在事件被觸發時被激活,但不管我做了什麼,參數colName總是爲空。對此問題的任何幫助表示讚賞。
爲什麼不簡單地在currBetrag類的setter中執行計算?只要值被改變,就會調用列中顯示的屬性的setter,然後可以將CalculateAusgabe方法移動到currBetrag類並在所有這些setter中調用它。這是使用MVVM模式解決此問題的方法。您將無法使用指定DataGridTextColumn作爲RelativeSource,因爲DataGridColumn不是視覺元素,而是添加到可視化樹中。 – mm8
謝謝你mm8,聽起來很合理。我已經使用了多年的WinForms應用程序,現在正在努力作爲wpf/xaml的新手,所以請你更詳細些?你能舉一個這樣的「制定者」的簡短例子嗎? –
請參考我的回答。 – mm8