我为自动生成的DataContext
类MyContext
中类型的超类设置了一个名为MyEntityBase
的自定义基类型。在尝试创建模拟数据上下文时,我决定在MyEntityBase
上实现INotifyPropertyChanged
,以便我可以一般地跟踪更改。自定义DataContext上的INotifyPropertyChanged基类型不会触发
这里是我的课是什么样子:
public abstract class MyEntityBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
}
基于这一类
,我创建了一个通用的Repository<T>
类存储特定实体类型的实例。该类背后的基本思想是提供类似于数据上下文的方法,但是由内存列表提供支持。我还想模拟跟踪更改,因为更改集对于我们的应用程序的业务逻辑与第三方系统同步非常重要。
这是一个基本的shell执行Repository<T>
:
public class Repository<T>
where T : MyEntityBase, INotifyPropertyChanged
{
protected List<T> _data;
public Repository(List<T> data)
{
this._data = data;
foreach (var entity in this._data)
{
entity.PropertyChanged += new PropertyChangedEventHandler(entity_PropertyChanged);
}
}
protected void entity_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
Console.WriteLine("HERE");
}
}
现在我创建Employee
类型的简单库,填充一些数据,并试图修改数据的属性。由于Employee
对象具有自动生成的DataContext
内置的属性更改通知,因此我预计PropertyChanged
事件会上升。然而,当我运行下面的代码,我没有看到任何地方输出产生HERE
:
var data = new List<Employee> {
new Employee { FirstName = "Bob" },
new Employee { FirstName = "Joe" },
};
var repo = new Repository<Employee>(data);
// This should fire the PropertyChanged event
data[0].FirstName = "John";
我在做什么错?
更新:如果我更改订阅事件以下行:
(entity as Employee).PropertyChanged += ...
然后正常工作。但是,T
已知为Employee
而entity
是Employee
类型的实例,所以有什么区别?即使我将MyEntityBase
中的event
设置为virtual
,它仍然无法正常工作。
我在这里复制你的代码http://dotnetpad.net/ViewPaste/HfGdC7ypCEC4TYZ-Vb7I0A(并且添加虚拟到实体)。这似乎工作..也许有什么在员工搞乱它? – Patrick 2012-04-10 18:02:02
嗯,我不能控制'Employee',因为它是使用'SQLMetal'自动生成的。但看起来不同的是缺少'override'关键字,并且删除它会导致它在测试代码上再次失败。 – mellamokb 2012-04-10 18:37:03
所以它看起来像我需要一种方法来强制像Employee一样的继承类总是覆盖PropertyChanged,即使关键字'override'不存在。这样的事情甚至可能吗? – mellamokb 2012-04-10 18:53:30