Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使模型类在WPF中可见_C#_Wpf_Mvvm_Frameworks_Inotifypropertychanged - Fatal编程技术网

C# 如何使模型类在WPF中可见

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 {

场景

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

一定有更聪明的方法可以做到这一点

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

否则,您可以从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:嗯,不,不完全是。我不想将视图直接绑定到模型。我想避免一次又一次地写垃圾锅炉板代码。