自定义DataContext Base Type上的INotifyPropertyChanged不会触发

时间:2012-04-10 17:21:54

标签: linq-to-sql mocking datacontext inotifypropertychanged

我有一个名为MyEntityBase的自定义基类型,用于我自动生成的DataContextMyContext类中的类型的超类。在尝试创建模拟数据上下文时,我决定在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 += ...

然后它工作正常。但是,已知TEmployeeentityEmployee类型的实例,那么区别是什么?即使我将event中的MyEntityBase设为virtual,它仍然无法正常工作。

1 个答案:

答案 0 :(得分:0)

我已经实施了可行的解决方案,所以我将回答我自己的问题。由于我已经使用了命令行工具FindAndReplaceText.exe来对自动生成的MyDataContext.dbml文件进行一些自定义,因此我在最后添加了另一个调用,我在其中修改了生成的{{要包含MyDataContext的{​​1}}类。结合使我的基类在事件的定义中使用override,这解决了问题:

virtual

现在,我的测试代码中的属性更改通知正确。