C# 如何使模型类在WPF中可见
场景 我从外部组件或代码部分获得一个模型类,在这里我不想修改某些内容。 我想将这个类绑定到一些WPF UI。 如果这个模型被修改,我还想刷新UI 问题 我真的需要一直编写一个包装器类,为每个setter创建PropertyChanged事件吗? 我怎样才能防止手动编写所有这些线索编码 开始是这样的C# 如何使模型类在WPF中可见,c#,wpf,mvvm,frameworks,inotifypropertychanged,C#,Wpf,Mvvm,Frameworks,Inotifypropertychanged,场景 我从外部组件或代码部分获得一个模型类,在这里我不想修改某些内容。 我想将这个类绑定到一些WPF UI。 如果这个模型被修改,我还想刷新UI 问题 我真的需要一直编写一个包装器类,为每个setter创建PropertyChanged事件吗? 我怎样才能防止手动编写所有这些线索编码 开始是这样的 public class User : IUser { public String Name { get; set; } public bool CurrentlyLoggedIn {
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使用它来生成一个代理类,该类将自动为您实现
INotifyPropertyChanged
(包括事件引发)。
用法如下所示:
IUser userProxy = DataBindingFactory.Create<User>();
IUser userProxy=DataBindingFactory.Create();
我听说有人使用面向方面的技术将这些功能注入到代码中。查看www.PostSharp.net。登录页甚至特别提到INotifyPropertChanged。@Crowcoder这看起来很棒,但它确实要求他能够编辑模型类,正如他所指定的,它们来自外部组件。您知道PostSharp
是否有能力在运行时执行此操作吗?@Moti我自己知识不多,所以我不太愿意做更多的事情,而不仅仅是说“检查一下,这可能有用”,但我看到他们执行加载时编织和运行时静态编织,这听起来似乎不需要修改您正在使用的库的实际代码。因此,MVVM中有M,您希望将其绑定到V。看起来您缺少了VM部分,它应该向V公开属性以进行绑定。这些VM属性可能会在M上获得一个属性,但是将M直接绑定到V并不是一个好主意。看看有什么想法(你不需要使用他的框架)@Mashton:嗯,不,不完全是。我不想将视图直接绑定到模型。我想避免一次又一次地写垃圾锅炉板代码。