[英]XAML bind command parameter to DataGrid column name
我正在使用Galasoft MVVM Light。 我有一個DataGrid,其中有四列,分別為總金額,增值稅稅率,增值稅金額和凈額。 當用戶更改其中一個值時,我需要重新計算其他三個值。 我在DataGrid的CellEditEnding事件上附加了一個中繼命令,以激活ViewModel中執行計算的代碼。 但是我需要知道更改了哪個值才能正確進行計算。 如何在XAML中指定哪個列/單元觸發了事件,即如何將命令參數綁定到觸發列/單元的名稱?
<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>
在ViewModel中,代碼為:
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":
...
DataGrid的當前行綁定到currBetrag
對象。 一切正常,觸發事件時將激活CalculateAusgabe
但是無論我做什么,colName參數始終為null。 感謝您提供有關此問題的任何幫助。
您可以在currBetrag類的設置器中執行計算,例如:
public class currBetrag : INotifyPropertyChanged
{
private decimal _bttoBetrag;
public decimal BttoBetrag
{
get { return _bttoBetrag; }
set
{
_bttoBetrag = value;
OnPropertyChanged();
CalculateAusgabe("BttoBetrag");
}
}
private decimal _uStBetrag;
public decimal UStBetrag
{
get { return _uStBetrag; }
set
{
_uStBetrag = value;
OnPropertyChanged();
CalculateAusgabe("UStBetrag");
}
}
private void CalculateAusgabe(string colName)
{
if (USt == null) return;
switch (colName)
{
//set the value of all fields...
_uStBetrag = ?;
}
//and raise the PropertyChanged event for all involved properties
OnPropertyChanged("UStBetrag");
OnPropertyChanged("NttoBetrag");
//...
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged([CallerMemberName] String propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
請注意,不管您的母語是什么,都不要使用英語成員名稱,這是一種不好的做法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.