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

标签 c# wpf mvvm frameworks inotifypropertychanged

场景

我从外部组件或我不想更改某些内容的代码部分获取模型类。 我想将此类绑定(bind)到某些 WPF UI。 如果此模型发生更改,我还想刷新 UI。

问题

我真的需要一直编写一个包装类,为每个 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 ) );
        }
    }
}

一定有更智能的方法来做到这一点!?

最佳答案

如果这种情况在您的代码中发生的次数不多,我建议您使用样板代码。

否则,你可以使用这个cool piece of code从 Ayende 生成一个代理类,它将自动为您实现 INotifyPropertyChanged(包括事件引发)。 用法如下所示:

IUser userProxy = DataBindingFactory.Create<User>();

关于c# - 如何在 WPF 中使模型类可观察,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27962209/

相关文章:

xamarin - Exrin动画

c# - 在 C# 中传递变量

c# - 在没有 DBSet 的情况下使用 c# linq 执行 SQL Server 存储过程

c# - 在 C# 中反序列化 JSON 时,我们可以为一个属性生成值作为其他属性的组合吗?

wpf - UserControl 和 ContentControl 有什么区别?

c# - 从一个 View 模型在另一个 View 模型的当前实例中获取属性值

ios - 在swift中使用mvvm模式的网络调用功能

c# - 防止多次调用 Web 服务

wpf - 为什么在控件上使用弱事件模式而不是在其他地方管理生命周期?

Wpf 组合框可选默认项