我有一个名为MyEntityBase
的自定义基类型,用于我自动生成的DataContext
类MyContext
类中的类型的超类。在尝试创建模拟数据上下文时,我决定在INotifyPropertyChanged
上实现MyEntityBase
,以便我可以一般跟踪更改。
这是我班级的样子:
public abstract class MyEntityBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
}
基于这个类,我创建了一个通用的Repository<T>
类,用于存储特定类型实体的实例。这个类背后的基本思想是提供类似于datacontext的方法,而是由内存列表支持。我还想模拟跟踪更改,因为更改集对于我们的应用程序的业务逻辑非常重要,可以与第三方系统同步。
以下是Repository<T>
的基本shell实现:
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
的简单存储库,填充一些数据,并尝试修改数据的属性。我希望PropertyChanged
事件被引发,因为Employee
对象具有自动生成的DataContext
内置的属性更改通知。但是,当我运行以下代码时,我看不到输出中生成的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
类型的实例,那么区别是什么?即使我将event
中的MyEntityBase
设为virtual
,它仍然无法正常工作。
答案 0 :(得分:0)
我已经实施了可行的解决方案,所以我将回答我自己的问题。由于我已经使用了命令行工具FindAndReplaceText.exe
来对自动生成的MyDataContext.dbml
文件进行一些自定义,因此我在最后添加了另一个调用,我在其中修改了生成的{{要包含MyDataContext
的{1}}类。结合使我的基类在事件的定义中使用override
,这解决了问题:
virtual
现在,我的测试代码中的属性更改通知正确。