使用 Breeze.Sharp.BaseEntity class 时如何手动通知框架 属性 更改?

How can I manually notify the Framework of property changes when using the Breeze.Sharp.BaseEntity class?

我已经在工作中使用 Breeze.Sharp.BaseEntity 基础 class 一段时间了,直到现在,可以使用它们的 GetValueSetValue 属性插入 INotifyPropertyChanged 接口。但是,偶尔从单个 属性 通知一次对多个属性的更改是有利的。举个简单的例子。

假设我们要执行一个简单的求和。我们有一个 ItemAmount 属性、一个 ItemQuantity 属性 和一个 Total 属性。每次 ItemAmountItemQuantity 属性 值发生变化时,我们也希望更新总数。传统上,我们可以这样做:

public double ItemAmount
{
    get { return _itemAmount; }
    set 
    {
        _itemAmount = value;
        NotifyPropertyChanged("ItemAmount");            
        NotifyPropertyChanged("Total");
    }
}

public int ItemQuantity
{
    get { return _itemQuantity; }
    set 
    {
        _itemQuantity = value;
        NotifyPropertyChanged("ItemQuantity");            
        NotifyPropertyChanged("Total");
    }
}

public double { get => ItemAmount * ItemQuantity; }

这将使框架也根据需要更新 Total 属性 的值,因为 属性 已更改。但是,我找不到使用他们的基础 class 调用 INotifyPropertyChanged 接口的方法,令人难以置信的是,他们似乎隐藏了对其实现的访问权限。

所以,我的问题是 如何在使用 Breeze.Sharp.BaseEntity class 时手动通知框架 属性 更改?

有没有什么方法可以连接到我尚未解决的实现?当我添加自己的实现时,它似乎没有与框架连接,并且没有成功通知更改。非常感谢。

没有简单的答案,但我找到的方法是克隆 Breeze.Sharp repository 并进行以下更改。在 Breeze.Sharp.Standard 解决方案中,打开 EntityAspect.cs class 并简单地添加您想要的方法来引发 PropertyChanged 事件处理程序,该处理程序已在 class 中声明:

public void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

然后,您可以从您的 BaseEntity class 中这样调用它:

public int ItemQuantity
{
    get => GetValue<int>();
    set
    {
        SetValue(value);
        EntityAspect.NotifyPropertyChanged(nameof(Total));
    }
}

请注意,对 ItemQuantity 属性 的更改是在 SetValue 方法内部提出的。