我有一个客户端服务器应用程序。从服务器中,我得到了一个简单的数据传输对象。例如
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 - 即没有任何东西绑定到对象上的任何属性。