【问题标题】:UWP - MVVM - value not updated when calculated propoerty value changesUWP - MVVM - 计算的属性值更改时未更新值
【发布时间】: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


    【解决方案1】:

    对于要更新的​​值,必须发生触发器。在这种情况下,触发器不会跳转,因此永远不会重新计算父级中的值。

    您必须观察其中一个子控件是否引发事件并对其进行分析。这里有两个解决方案: 安排整个事件管理过程。也许使用 XAML 有一个更漂亮的解决方案,但我已经通过手动管理事件解决了这种情况。

    当我们创建一个子时,父级订阅它的 PropertyChanged 事件 (PropertyChangedEventHandler)。然后,我们在父级中将收到 PropertyChangedEventArgs 参数,其中我们有 PropertyName。如果 PropertyName 是我们想要的 - 我们在父 VM 中重新计算 TOTAL。

    【讨论】:

    • 嗨,安东,谢谢您的回答。当您告诉“我们重新计算父 VM 中的 TOTAL”时,您的意思是调用 raispropertychanged("Calculatedproperty") ?
    • 当您收到事件并捕获它时,您会在特殊的方法/函数中执行它。比如点击事件:mouse.Click += mouse_click; mouse_click(x args) { // 检查 args 做任何事情 } 如果你的 get {return make calculation} 中的计算属性是可能的,只需将 PropertyChange 提升到具有属性名称的视图。但是如果Calculation有属性已经计算过值,则需要先进行计算,然后调用PropertyChange通知给View。
    猜你喜欢
    • 1970-01-01
    • 2019-06-03
    • 2021-10-31
    • 2020-11-24
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多