事件处理程序使用单一实例类为 null



我有一个客户端服务器应用程序。从服务器中,我得到了一个简单的数据传输对象。例如

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 都是空的,我不知道为什么。

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

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从未订阅过。

据我所知,您有一个带有属性的对象(您的PersonCm),但是当其属性更改时,扩展方法会导致ClientFunctions.Instance对象引发PropertyChanged事件。仅当绑定到该ClientFunctions.Instance对象的属性时,才会订阅该PropertyChanged。包含属性的对象必须使用自己的PropertyChanged事件(例如,通过继承基类)实现INotifyPropertyChanged自身。

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

相关内容

  • 没有找到相关文章

最新更新