我有这样的树结构:
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
而且这些变化也没有反映在模型上。
如何通过视图模型类更新模型?
答案 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
}
不要忘记处理已更改的事件