使用singleton类,Eventhandler为null

时间:2013-01-31 13:10:28

标签: c# wpf extension-methods inotifypropertychanged

我有一个客户端服务器应用程序。 从服务器我得到一个简单的数据传输对象。 e.g。

public class Person:BaseObject
{
  public string Name { get; set; }

  public string Course { get; set; }

  public Person( string name )
  {
    this.Name = name;
  }
}

在客户端,我有一个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为null,我不明白为什么。

是否有人对我有任何想法或提示。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

从我可以看到你有一个带有属性的对象(你的PersonCm),但是当它的属性发生变化时,扩展方法会导致ClientFunctions.Instance对象引发PropertyChanged个事件。只有在绑定到PropertyChanged对象上的属性时,才会订阅ClientFunctions.Instance。包含您的属性的对象必须使用自己的INotifyPropertyChanged事件(例如,通过继承基类)来实现PropertyChanged本身。

(如果该事件没有订阅者,则PropertyChanged将为null - 即没有任何内容绑定到该对象的任何属性。)