我目前正在寫一個實現了INotifyPropertyChanged接口在我的ViewModels如何通過同一個視圖模型
的的ViewModels有幾個特性,其中一些特性是基於其他計算性能的C#WPF應用程序的性能傳遞活動屬性值。
我想要做的就是簡化現有的代碼,以允許propertyChanged事件通過屬性傳遞,以便xaml中的相應綁定全部更新。
例如:viewmodel包含Total,BreadQuantity和BreadCost屬性。當BreadQuantity屬性發生變化時,它必須通知用戶界面對BreadQuantity和Total屬性的更改以更新相應的綁定。我只想調用BreadQuantity的PropertyChanged事件,因爲Total使用該屬性來計算總數,所以它的相應綁定也應該更新。
下面我已經包含了我的視圖模型繼承包含事件類以及與什麼可行,什麼我試圖做
下面的例子視圖模型的屬性是處理事件的類爲ViewModels。 OnPropertyChanged(字符串名稱)方法用於通知正在更新的屬性.NewOnPropertyChanged是一個新的,它執行相同的操作,但縮短了視圖模型中的代碼,並且還使用屬性來接收屬性名稱,以防止輸入錯誤從導致正確的事件不發射。
public class ObservableObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string name)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
public void NewOnPropertyChanged<T>(ref T variable, T value, [CallerMemberName] string propertyName = "")
{
variable = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
下面是從繼承視圖模型預期
public decimal TotalCost
{
get
{
decimal[] quant_list = new decimal[3] { BreadQuantity, MilkQuantity, CerealQuantity };
decimal[] price_list = new decimal[3] { BreadPrice, MilkPrice, CerealPrice };
return calc_cost.CalculateCostArray(quant_list, price_list);
}
set
{
NewOnPropertyChanged<decimal>(ref _total_cost, value);
}
}
public decimal BreadPrice
{
get
{
return _bread_price;
}
set
{
NewOnPropertyChanged<decimal>(ref _bread_price, value);
OnPropertyChanged("TotalCost");
}
}
不過,我想找到一種方法,我可以避開OnPropertyChanged("TotalCost");
對於被綁定到視圖中的每個屬性,作品的屬性。
此應用程序僅用於學習這些術語,但是測試應用程序的全面應用將做同樣的事情,但將有與性能相關的一些計算性能,將創造大量的冗餘樣板代碼和可能性錯別字
例如,如果有3點以上的屬性與它相關聯的則編號必須做
public int BreadQuantity
{
get
{
return _bread_quantity;
}
set
{
NewOnPropertyChanged<int>(ref _bread_quantity, value);
OnPropertyChanged("TotalCost");
OnPropertyChanged("Inventory");
OnPropertyChanged("CartItems");
}
}
這對我看起來像一個簡單的方法來引入錯誤和大量的緊耦合到程序中。如果後來我想重構代碼並將TotalCost重命名爲TotalCostOfItems,那麼我將無法使用visual studio「f2」命令來做到這一點,我將不得不搜索這些字符串來更新它們,這就是我正在嘗試的避免。
非常感謝您提前爲所有那些誰花時間來閱讀我的問題,並認爲解決
@@@@@@@@ 編輯 的@@@@@@@@
發現,在C#6.0,你可以用nameof(Property)
獲取從屬性字符串,並且還允許您重構應用程序安全
你介意給我舉個例子嗎? – BossmanT
更仔細地看你的問題,這種方法可能不適合你,因爲它依賴於「預先計算」計算屬性並存儲它,而不是在獲取器中請求時即時計算它。你還對一個例子感興趣嗎? –
我假設你正在談論的是讓我的BreadQuantity屬性的set方法調用我的Total屬性的set方法,這樣我可以控制哪些屬性觸發事件 – BossmanT