1

我一直Breeze.Sharp.BaseEntity在工作中使用基类一段时间,直到现在,使用它们的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根据需要在任一属性更改时更新该属性的值。但是,我找不到这样的方法来INotifyPropertyChanged使用他们的基类调用接口,令人难以置信的是,他们似乎隐藏了对其实现的访问。

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

有什么方法可以连接到我还没有解决的实现吗?当我添加自己的实现时,它似乎没有与框架连接,也没有成功通知更改。提前谢谢了。

4

1 回答 1

1

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

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

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

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

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

于 2021-08-06T15:51:36.620 回答