使用 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 一段时间了,直到现在,可以使用它们的 GetValue
和 SetValue
属性插入 INotifyPropertyChanged
接口。但是,偶尔从单个 属性 通知一次对多个属性的更改是有利的。举个简单的例子。
假设我们要执行一个简单的求和。我们有一个 ItemAmount
属性、一个 ItemQuantity
属性 和一个 Total
属性。每次 ItemAmount
或 ItemQuantity
属性 值发生变化时,我们也希望更新总数。传统上,我们可以这样做:
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
方法内部提出的。
我已经在工作中使用 Breeze.Sharp.BaseEntity
基础 class 一段时间了,直到现在,可以使用它们的 GetValue
和 SetValue
属性插入 INotifyPropertyChanged
接口。但是,偶尔从单个 属性 通知一次对多个属性的更改是有利的。举个简单的例子。
假设我们要执行一个简单的求和。我们有一个 ItemAmount
属性、一个 ItemQuantity
属性 和一个 Total
属性。每次 ItemAmount
或 ItemQuantity
属性 值发生变化时,我们也希望更新总数。传统上,我们可以这样做:
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
方法内部提出的。