有没有一种方法来监视任何对象的更改的对象图,并以此为基础进行改变些什么呢?

可以说我有以下内容:

public class Main:INotifyPropertyChanged
{
    public ObservableCollection<Foo> FooItems { get; }
    public ObservableCollection<Bar> BarItems { get; }
}

public class Foo:INotifyPropertyChanged

public class Bar:INotifyPropertyChanged
{
    public ObservableCollection<Other> OtherItems { get; }
}

public class Other:INotifyPropertyChanged

什么是执行所有对象的某种变化通知系统的最好方式?例如自动保存,其中的任何改变将触发系统序列化Main类。

我应该在Main类留意变化BarItems胶水代码,挂接到他们PropertyChanged?这似乎有点乱,而且容易出错给我。有没有更好的办法?

有帮助吗?

解决方案

而不是提高自己的财产的对象改变事件,或许他们可以提高共享事件来代替。例如:

public class SharedChangeNotifier
{
    public static event EventHandler<DataChangedEventArgs> SharedChangeEvent;

    protected void RaiseChangeEvent()
    {
        if (SharedChangeNotifier.SharedChangeEvent != null)
        {
            SharedChangeNotifier.SharedChangeEvent(
                this, new DataChangedEventArgs());
        }
    }
}

public class Foo : SharedChangeNotifier
{
    public int MyProperty
    {
        get { ... }
        set
        {
            ...
            RaiseChangeEvent();
        }
    }
}

您可以再附加一个事件处理程序,以静态SharedChangeNotifier的SharedChangeEvent通知,每当从SharedChangeNotifier获得任何对象改变,如:

SharedChangeNotifier.SharedChangeEvent += (sender, args) => {
    DoWhatever();
};

其他提示

我刚刚看了关于这一问题的一个有趣的博客文章在 http://www.lennybacon.com/ ReBlinderFleckChangeTracking.aspx

在后是在德国,但它主要是代码,它应该没问题。

希望这有助于!

我已经在过去所做它的方式是创建一个单独的ChangeTracker类至寄存器物体进入它的方法。内部的方法,使用反射来注册对象探索,并钩到在其每个场所中实现INotifyPropertyChanged的事件。

可以然后方法添加到ChangeTracker询问状态,例如IsDirty(),或甚至在ChangeTracker执行INotifyPropertyChanged。

(一定要落实和对ChangeTracker使用IDisposable接口,以及当时丢弃所有的事件处理程序)。

您可以有针对执行INotifyPropertyChanged事件的所有物品一样处理:

foreach (INotifyPropertyChanged obj in FooItems)
    obj.PropertyChanged+= this.modified;

// likewise for bar items, and when items are added

private void modified(object sender, EventArgs args)
{
    this.Save();
}

编辑>要做同样的,当一个项目被添加:

private void addToList<T>(ref List<T> l, T item) where T : INotifyPropertyChanged
{
    item.PropertyChanged += this.modified;
    l.Add(item);
}

调用它使用:

Foo item = new Foo();
List<Foo> fooItems = new List<Foo>();

addToList<Foo>(ref fooItems, item);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top