0

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

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

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

4

2 回答 2

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从来没有订阅过。

于 2013-01-31T13:41:34.737 回答
0

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

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

于 2013-01-31T13:41:00.143 回答