【发布时间】:2012-11-06 19:21:38
【问题描述】:
有没有办法为使用集合中“子实体”属性的计算属性触发某种OnPropertyChanged 事件?
一个小例子:
我有一个简单的 WPF 应用程序,其中包含一个显示客户属性的 DataGrid。 我正在使用 Entity Framework 5,CodeFirst 方法,因此我使用自己的 INotifyPropertyChanged 实现手动编写了我的类。
public partial class Customer : INotifyPropertyChanged
{
private string _firstName;
public virtual string FirstName
{
get { return _firstName; }
set
{
_firstName = value;
OnPropertyChanged("FirstName");
OnPropertyChanged("FullName");
}
}
private string _lastName;
public virtual string LastName
{
get { return _lastName; }
set
{
_lastName = value;
OnPropertyChanged("LastName");
OnPropertyChanged("FullName");
}
}
public virtual ICollection<Car> Cars { get; set; }
public virtual ICollection<Invoice> Invoices { get; set; }
...
}
现在我在同一个类中创建了 3 个计算属性:
public string FullName
{
get { return (FirstName + " " + LastName).Trim(); }
}
public int TotalCars
{
get
{
return Cars.Count();
}
}
public int TotalOpenInvoices
{
get
{
if (Invoices != null)
return (from i in Invoices
where i.PayedInFull == false
select i).Count();
else return 0;
}
}
FullName 在 DataGrid 中自动更新,因为我正在调用 OnPropertyChanged("FullName");
我找到了一个 INotifyCollectionChanged 实现的示例,当向 ICollection 添加或删除某些内容时,我可能可以使用它来自动更新 TotalCars:
http://www.dotnetfunda.com/articles/article886-change-notification-for-objects-and-collections.aspx
但是当 ICollection (Invoices) 中的属性 (PayedInFull) 发生更改时,触发 OnPropertyChange("TotalOpenInvoices") 的最佳方法是什么?
在 Invoice 类中执行类似 OnPropertyChanged("Customer.TotalOpenInvoices"); 的操作似乎并不能解决问题... :)
【问题讨论】:
-
您可以调用客户的属性更改。
-
这个特殊的问题导致我最终创建了自己的 MVVM 框架
-
您可以使用手动方法.. 或开始使用表达式树来找出您必须在哪个实例中引发 PropertyChanged 事件。
标签: c# wpf datagrid entity inotifycollectionchanged