我有一个客户端服务器应用程序。 从服务器我得到一个简单的数据传输对象。 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,我不明白为什么。
是否有人对我有任何想法或提示。
答案 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 - 即没有任何内容绑定到该对象的任何属性。)