【问题标题】:How to make a model class observable in WPF如何在 WPF 中使模型类可观察
【发布时间】:2015-03-13 18:34:34
【问题描述】:

场景

我从外部组件或代码部分获取模型类,我不想在其中更改某些内容。 我想将这个类绑定到一些 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 ) );
        }
    }
}

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

【问题讨论】:

  • 我听说有人使用面向方面的技术将此类功能注入代码中。结帐 www.PostSharp.net。登陆页面甚至特别提到了 INotifyPropertChanged。
  • @Crowcoder postsharp.net/model/inotifypropertychanged 这看起来很棒,但它确实需要他能够编辑模型类,并且正如他所指定的,它们来自外部组件。你知道PostSharp 是否有能力在运行时做到这一点?
  • @Moti 我自己也不是很了解,所以我犹豫要做的不仅仅是说“检查一下,它可能有用”,但我看到他们做加载时编织和运行时静态编织听起来不需要修改您正在使用的库的实际代码。 postsharp.net/aop.net/runtime-weaving
  • 所以你在 MVVM 中有 M,你想将它绑定到 V。看起来你错过了 VM 部分,它应该向你的 V 公开属性以进行绑定。这些 VM 属性可能会 get M 上的一个属性,但是将 M 直接绑定到 V 并不是一个好主意。看看xamlpatterns.com/stateless-view-models 的想法(你不需要使用他的框架)
  • @Mashton:嗯,不,不完全是。我不想将我的视图直接绑定到我的模型。我想避免一次又一次地编写转储样板代码。

标签: c# wpf mvvm frameworks inotifypropertychanged


【解决方案1】:

如果它在您的代码中没有发生很多次,我建议您使用样板代码。

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

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

【讨论】:

    猜你喜欢
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 2018-06-28
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    相关资源
    最近更新 更多