2013-01-31 26 views
0

我有一个客户端服务器应用程序。 从服务器我得到一个简单的数据传输对象。 例如我有一个WPF应用程序,所以我不得不使用INotifyPropertyChanged。 现在我寻找一种优雅的方式在我的对象中实现这一点。我的优点是大多数对话框只显示,所以没有理由在那里实现它,因为在这些情况下,整个对象将被切换(为此,我在包含对象的ViewModel中使用INotifyPropertyChanged)。现在我有一种情况,房地产在更深的结构中发生变化,我的观点没有注意到。使用单例类的事件处理程序为空

我尝试用继承和扩展来解决它。 我写了“自己”的课。

public class PersonCm : Person 
{ 
    public new string Course 
    { 
     get 
     { 
     return base.Course; 
     } 
     set 
     { 
     base.Course = value; 
     this.PropertyChanged(); 
     } 
} 

因此,我从我的基类和“覆盖”只有这些我需要我的INotifyPropertyChanged所有属性。要添加我的功能,我使用以下两个类:

public class ClientFunctions : INotifyPropertyChanged 
{ 
    public static readonly ClientFunctions Instance = new ClientFunctions(); 

    private ClientFunctions() 
    { 
     // Empty 
    } 

    [field: NonSerialized] 
    public event PropertyChangedEventHandler PropertyChanged; 

    public bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = "") 
    { 
     if (object.Equals(storage, value)) 
     { 
     return false; 
     } 

     storage = value; 
     this.OnPropertyChanged(propertyName, storage); 
     return true; 
    } 

    public void OnPropertyChanged(string propertyName, object sender) 
    { 

     var eventHandler = this.PropertyChanged; 
     if (eventHandler != null) 
     { 
     eventHandler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

INotifyPropertyChanged代码的单例类。

public static class Extension 
{ 
    public static void PropertyChanged(this BaseObject obj, [CallerMemberName] string propertyName = "") 
    { 
    ClientFunctions.Instance.OnPropertyChanged(propertyName, obj); 
    } 
} 

和一个扩展,它调用我的单例类。

我现在的问题是,每次我打电话给我的INotifyPropertyChanged代码我的PropertyChangedEventHandler为空,我不知道为什么。

有没有人有我的想法或提示。

回答

0

从我所看到的你有一个物件(你的PersonCm)有一个属性,但是当它的属性改变时,扩展方法导致ClientFunctions.Instance对象产生一个PropertyChanged事件。 PropertyChanged只会订阅,如果你绑定到该对象的属性。包含你的财产的对象肯定必须使用自己的PropertyChanged事件(例如通过继承一个基类)来实现INotifyPropertyChanged本身。

(如果没有订阅该事件PropertyChanged将是无效的 - 即没有被绑定到任何属性的对象上)

+0

谢谢。没有人订阅我的ClientFunctions。 我将INotifyPropertyChanged添加到我的Cm-class,并使用添加和删除将订阅链接到我的ClientFunctions。 – Sukram

1

在你 PersonCm类,你需要通过属性的名称被更改。

public class PersonCm : Person 
{ 
    public new string Course 
    { 
     get 
     { 
     return base.Course; 
     } 
     set 
     { 
     base.Course = value; 
     this.PropertyChanged("Course"); // should fix it 
     } 
} 

编辑

我看你现在正在做的[CallerMemberName]使用所以这不是修复。

看起来像ClientFunctions.Instance.PropertyChanged永远不会订阅。