如何在WPF中使模型类可观察

Sev*_*ven 6 c# wpf frameworks mvvm inotifypropertychanged

脚本

我从外部组件或代码部件获取模型类,我不想改变某些东西.我想将这个类绑定到一些WPF UI.如果这个模型被改变,我也想刷新UI.

题

我是否真的需要一直编写一个包装类,为每个setter创建PropertyChanged事件?我怎么能阻止手动编写所有这些线索编码?

什么开始这样......

public class User : IUser
{
    public String Name { get; set; }
    public bool CurrentlyLoggedIn { get; set; }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

......总会像这样膨胀

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 ) );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

必须有一种更聪明的方式来做到这一点!?

Mot*_*Azu 4

如果这种情况在您的代码中没有发生很多次,我建议您执行样板代码。

否则,您可以使用 Ayende 的这段很酷的代码来生成一个代理类,该代理类将自动INotifyPropertyChanged为您实现(包括事件引发)。用法如下:

IUser userProxy = DataBindingFactory.Create<User>();
Run Code Online (Sandbox Code Playgroud)