【发布时间】:2020-09-13 05:52:43
【问题描述】:
我正在开发基于 MVVM 模式的 UWP 应用。
我创建了一个绑定到父 ViewModel 的视图。 父视图模型包含一个子视图模型属性
Child ViewModel 包含一些信息,尤其是“NumberOfDays”和“AmountPerDay”
Parent ViewModel 包含自己的属性,尤其是“DiscountAmount”和“TravellingExpenseAmount”。 父 ViewModel 还包含计算的属性: - TotalHT = (NumberOfDays * AmountPerDay) - DiscountAmount + TravellingExpenseAmount
此属性绑定到截图中的“Total avant Taxes”
请注意,计算基于两个 ViewModel 的属性。
问题如下: - 当我从父视图模型(DiscountAmount 或 TravellingExpenseAmount)更新属性时,会引发 TotalHT 计算属性更改并更新文本框值 - 当我从 ChildViewModel(NumberofDays 或 AmountPerDay)更新属性时,即使从子 ViewModel 手动 RaisePropoertyChange 父计算属性(RaisePropertyChange(“计算属性”))也不会发生任何事情。
所有 ViewModel 都实现了 INotifiedPropertychange(MVVM 轻量级工具包)。
更新:似乎只有两个 ViewModel 的属性没有正确更新
您对解决方案有任何想法吗?
更新: 更准确地说,我更新了我的代码以根据 Anton cmets 找出我的问题(感谢他 ;-))
我将计算的属性替换为“可写”属性,如下所示:
private string totalBeforTaxes3 = 0.ToString("C", CultureInfo.CurrentCulture);
public string TotalBeforeTaxes3
{
get => totalBeforTaxes3;
set => Set(() => TotalBeforeTaxes3, ref totalBeforTaxes3, value, true);
}
我将默认值设置为 0。
我还创建了一个方法来更新值并强制 RaisePropertyChanged(即使由于 Set() 方法已经这样做而没有用。这里是方法代码:
public void CalculateTotalBeforeTaxes()
{
TotalBeforeTaxes3 = (Double.Parse(Details.TotalHT, NumberStyles.Currency) - Double.Parse(DiscountAmount, NumberStyles.Currency) + Double.Parse(TravellingExpensesAmount, NumberStyles.Currency)).ToString("C", CultureInfo.CurrentCulture);
RaisePropertyChanged("TotalBeforeTaxes3");
}
现在,当我打开页面时,文本框的值为 O€ 并且永远不会更新。每次我更新作为计算一部分的值时,都会调用 CalculateTotalBeforeTaxes() 并调用 RaisePropertyChanged,而不会出现任何错误。
另一个信息是 ChildViewModel 不是在 ParentViewModel Constructor 中初始化的,而是在之后(由于 ViewModelLocator 约束)。你觉得会不会有影响??
提前谢谢你
【问题讨论】:
标签: c# mvvm uwp calculated-field