【问题标题】:MVVM update view model when model changes模型更改时 MVVM 更新视图模型
【发布时间】:2018-06-30 11:32:44
【问题描述】:

我需要更新 ViewModel,当 Model 改变和 Model,当 ViewModel 改变。就我而言,我有:ProjectViewModel 实现 INotifyPropertyChangedProject(model) 实现 INotifyPropertyChanged。当 ViewModel 更改时,我只需直接更改 Model。但是当模型改变时,那又如何呢?我试图在 ViewModel 中处理 Model 的属性更改事件。但是我会从 long-live 模型中得到强引用,这会导致内存泄漏,或者不会?如果是的话,不然怎么办?

编辑:

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) 属性设为 public 并直接绑定?

【问题讨论】:

  • 请添加你有的代码,这样更容易理解
  • 造成内存泄漏很难说,但如果对象及其引用仍然被引用,则不会被垃圾回收。我会重新考虑您的方法:如果 ViewModel 与它所代表的模型一样长,那么它的目的是否纯粹是为了 UI 目的而精简模型?在这种情况下,(a) 模型是否足够或 (b) 是否存在将您的 ViewModel 映射回您的模型的点 - 然后充当 DTO?
  • @Gigabyte 我需要视图模型,因为将来它将包含与 UI 相关的内容(支持重命名等)。我将它用于 UI。并且模型可以从其他对象更新。它将包含用于保存的逻辑,可能还有更多内容。

标签: c# wpf mvvm


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果您的 VM 以任何方式依赖于模型中某个属性的值,那么是的,您需要订阅其 INPC 通知。但现实情况是,通常 VM 不需要知道具体的模型值,除非它正在聚合这些值(即从对象列表中求和一个值)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-17
      • 1970-01-01
      • 2012-11-14
      • 2014-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多