如何使模型 class 在 WPF 中可观察
How to make a model class observable in WPF
场景
我从外部组件或代码部分获得了一个模型 class,但我不想更改其中的某些内容。
我想将此 class 绑定到某些 WPF UI。
如果此模型被更改,我也想刷新 UI。
问题
我真的需要一直编写一个包装器 class 来为每个 setter 创建 PropertyChanged 事件吗?
我怎样才能避免手动编写所有这些线索编码?
是这样开始的...
public class User : IUser
{
public String Name { get; set; }
public bool CurrentlyLoggedIn { get; set; }
// ...
}
...永远这样臃肿
public class UserObservableWrapper : IUser, INotifyPropertyChanged
{
public String Name
{
get
{
return this.innerUser.Name;
}
set
{
if (value == this.innerUser.Name)
{
return;
}
this.innerUser.Name = value;
this.OnPropertyChanged( "Name" );
}
}
public bool CurrentlyLoggedIn
{
get
{
return innerUser.CurrentlyLoggedIn;
}
set
{
if (value.Equals( innerUser.CurrentlyLoggedIn ))
{
return;
}
innerUser.CurrentlyLoggedIn = value;
this.OnPropertyChanged( "CurrentlyLoggedIn" );
}
}
private readonly IUser innerUser;
public UserObservableWrapper( IUser nonObservableUser )
{
this.innerUser = nonObservableUser;
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged( string propertyName )
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
handler( this, new PropertyChangedEventArgs( propertyName ) );
}
}
}
一定有更智能的方法来做到这一点!?
如果它在您的代码中没有多次发生,我建议您使用样板代码。
否则,您可以使用 Ayende 的 cool piece of code 生成一个代理 class,它将自动为您实现 INotifyPropertyChanged
(包括事件引发)。
用法如下所示:
IUser userProxy = DataBindingFactory.Create<User>();
场景
我从外部组件或代码部分获得了一个模型 class,但我不想更改其中的某些内容。 我想将此 class 绑定到某些 WPF UI。 如果此模型被更改,我也想刷新 UI。
问题
我真的需要一直编写一个包装器 class 来为每个 setter 创建 PropertyChanged 事件吗? 我怎样才能避免手动编写所有这些线索编码?
是这样开始的...
public class User : IUser
{
public String Name { get; set; }
public bool CurrentlyLoggedIn { get; set; }
// ...
}
...永远这样臃肿
public class UserObservableWrapper : IUser, INotifyPropertyChanged
{
public String Name
{
get
{
return this.innerUser.Name;
}
set
{
if (value == this.innerUser.Name)
{
return;
}
this.innerUser.Name = value;
this.OnPropertyChanged( "Name" );
}
}
public bool CurrentlyLoggedIn
{
get
{
return innerUser.CurrentlyLoggedIn;
}
set
{
if (value.Equals( innerUser.CurrentlyLoggedIn ))
{
return;
}
innerUser.CurrentlyLoggedIn = value;
this.OnPropertyChanged( "CurrentlyLoggedIn" );
}
}
private readonly IUser innerUser;
public UserObservableWrapper( IUser nonObservableUser )
{
this.innerUser = nonObservableUser;
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged( string propertyName )
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
handler( this, new PropertyChangedEventArgs( propertyName ) );
}
}
}
一定有更智能的方法来做到这一点!?
如果它在您的代码中没有多次发生,我建议您使用样板代码。
否则,您可以使用 Ayende 的 cool piece of code 生成一个代理 class,它将自动为您实现 INotifyPropertyChanged
(包括事件引发)。
用法如下所示:
IUser userProxy = DataBindingFactory.Create<User>();