Wpf 从视图模型中的属性设置器触发计算是否不正确?

Wpf 从视图模型中的属性设置器触发计算是否不正确?,wpf,mvvm,Wpf,Mvvm,假设我有一个视图模型,它在实现INotifyPropertyChanged的视图模型中具有价格和数量属性,该视图模型绑定到文本框,总成本属性绑定到文本块。更新价格或数量时,应重新计算总成本 我理解,尽量减少在属性setter和getter内部完成的工作量是可取的。从属性设置器触发计算是否是一种不良做法?如果这是不好的做法,我还应该怎么做?我可以看到两种可能性 订阅PropertyChanged事件并从那里触发计算。我觉得这个事件更多的是供外部观察者使用,而不是在视图模型本身中使用,而且在任何情况

假设我有一个视图模型,它在实现
INotifyPropertyChanged
的视图模型中具有价格和数量属性,该视图模型绑定到文本框,总成本属性绑定到文本块。更新价格或数量时,应重新计算总成本

我理解,尽量减少在属性setter和getter内部完成的工作量是可取的。从属性设置器触发计算是否是一种不良做法?如果这是不好的做法,我还应该怎么做?我可以看到两种可能性

  • 订阅PropertyChanged事件并从那里触发计算。我觉得这个事件更多的是供外部观察者使用,而不是在视图模型本身中使用,而且在任何情况下,任何事件都是从setter触发的,所以我看不出它与直接从setter触发处理有多大的不同

  • 从文本框(例如LostFocus)上的事件触发计算通过从事件直接调用视图模型上的方法或将事件绑定到视图模型上的命令,属性将绑定到该文本框。在我看来,使用MVVM的想法是,如果可能的话,我们应该避免使用控制事件


  • 我担心这可能是一个主要基于意见的问题,无论如何,我想分享我的想法

    我认为在属性设置器中触发计算不会有太多问题。也许你怎么做很重要。IHMO在代码中的任何地方复制
    OnPropertyChanged(“CalculatedPropertyName”)
    都是不好的

    我更喜欢这样的:

    public int Quantity
    {
        get { return quantity; }
        set 
        {
            if (value != quantity)
            {
                quantity = value;
                OnPropertyChanged();
                Result = Quantity * Price;
            }
        }
    }
    
    public int Price
    {
        get { return price; }
        set 
        {
            if (value != price)
            {
                price = value;
                OnPropertyChanged();
                Result = Quanity * Price;
            }
        }
    }
    
    public int Result
    {
        get { return result; }
        private set 
        {
            if (value != result)
            {
                result = value;
                OnPropertyChanged();
            }
        }
    }
    
    这样,您只需使用一个私人setter,无需记住提出任何问题。这是我喜欢的方式,但是如果你正在寻找更复杂的方式,你可以找到很多想法和方法

    最后一件事——但并非最不重要——我不喜欢你建议的其他方式,我觉得它们太扭曲了