繁体   English   中英

当模型更改时,MVVM更新视图模型

[英]MVVM update view model when model changes

当模型更改时,我需要更新ViewModel;在ViewModel更改时,我需要更新Model。 就我而言,我有:ProjectViewModel实施INotifyPropertyChanged的项目 (模型)执行INotifyPropertyChanged的 当ViewModel更改时,我只是直接更改Model。 但是,当Model更改时,该怎么办? 我试图在ViewModel中处理Model的属性更改事件。 但是,我将获得长期模型的强大参考,这是否会导致内存泄漏? 如果是,那么该怎么做?

编辑:

class ProjectViewModel : INotifyPropertyChanged
{
    private Project Project;

    public string Name
    {
        get
        {
            return Project.Name;
        }
        set
        {
            Project.Name = value;
            OnPropertyChanged("Name");
        }
    }

    public ProjectViewModel(Project project)
    {
        this.Project = project;
        project.PropertyChanged += OnProjectChanged;
    }

    private void OnProjectChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "Name")
            OnPropertyChanged("Name");
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    } //and then things for UI....
}
class Project : INotifyPropertyChanged
{
    private string name;
    public string Name
    {
        get
        {
            return name;
        }
        set
        {
            name = value;
            OnPropertyChanged("Name");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }//and then logic (for saving)
}

EDIT2:还是可以在ViewModel中实现IDisposable之类的东西? 还是将ViewModel中的model(Project)属性设为公开并直接绑定?

如果您的VM以任何方式取决于模型中属性的值,则是,您将需要订阅其INPC通知。 但是现实是,通常,VM不需要了解特定的模型值,除非它正在汇总值(即,将对象列表中的值相加)。

当您确实需要订阅模型的INPC时,您还需要退订。 这并不像看起来那样麻烦,因为VM触发了模型的获取或重新获取,因此很清楚何时需要完成退订。 检查INotifyCollectionChanged接口-这是开始订阅和取消订阅的好地方。

就个人而言,我将按照您在第二次编辑中的建议进行操作,在Model上实现INotifyPropertyChanged ,将Project为公共属性,并直接绑定到Project.Name

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM