使用View Model的WPF MVVM更新模型

时间:2015-02-06 08:02:55

标签: c# wpf mvvm

我有这样的树结构:

public class Node
{
    public Node Parent { get; set; }
    public List<Node> Children { get; set; }
    public NodeValue Item { get; set; }
}

这样的NodeViewModel:

    public class NodeViewModel : INotifyPropertyChanged
    {
    public Node Node
    {
        get;
        private set;
    }
     public NodeViewModel(Node node)
    {
      this.Node = node;
      this._children = new ObservableCollection<NodeViewModel>();
    }

  public string Code { 
      get
      {
          return this.Item.Code;
      }
      set
      {
          this.Item.Code = value;
          NotifyPropertyChanged("Code"); 
      }
           }

  public Node Parent
  {
      get
      {
          return this.Node.Parent;
      }
      set
      {
          if (value != this.Node.Parent)
          {
              this.Node.Parent = value;
              NotifyPropertyChanged("Parent");
          }
      }
  }

  public NodeValue Item 
  {
      get
      {
          return Node.Item; 
      }
      set 
      {
          this.Node.Item = Item;
      } 
  }
private ObservableCollection<NodeViewModel> _children;

public ObservableCollection<NodeViewModel> Children 
  {
      get
      {
          _children.Clear();
         foreach(var child in Node.Children)
         {
             _children.Add(new NodeViewModel(child));
         }
         return _children;
      }
      protected set
      {
          this._children = value;
          NotifyPropertyChanged("Children");
      }
  }

问题是最后一个属性,因为当我想使用视图模型更新模型时,例如当我想添加新节点时,我必须从_children更新ObservableCollection NodeViewModel以及来自Children课程的List<Node> Node

如果我仅更新模型,则UI不会更新,因为NotifyPropertyChanged未被调用,如果我仅更新视图,则更改将会丢失,因为getter将创建另一个ObservableCollection而且这些变化也没有反映在模型上。

如何通过视图模型类更新模型?

2 个答案:

答案 0 :(得分:0)

无论您采用哪种方式切片,视图模型都需要完全封装模型。如果你有一个&#34; save&#34;命令你可以在那时更新/重新创建模型的集合。

假设你没有&#34;保存&#34;虽然命令,模型应始终反映视图模型的当前状态,一个选项是订阅ObservableCollection<T>.CollectionChanged事件并动态更新基础集合。


旁注,你很可能也不想在每次调用Children_get时创建一个新的集合,并且最好只是懒惰加载你保留的一个。

答案 1 :(得分:0)

ObservableCollection已经实现了INotifyPropertyChanged。 但是,只有在集合的计数发生变化时,它才会起作用。 另外你为什么要ViewModel收藏? 但我认为你正在寻找这种实施方式:

private ObservableCollection<Node> _children;

public ObservableCollection<Node> Children {
  ...code logic
}

不要忘记处理已更改的事件