在我的程序中,我有一个通过MVVM结构实现的TreeView
。我已经在此树的数据模型中实现了Parent
属性,但无法弄清楚如何设置子级的父级。
TreeViewViewModel:
private TreeModel createNewNode()
{
return new TreeModel()
{
Parent = null,
Children =
{
new BlockingTreeModel() { Parent = ?? }
};
}
TreeModel:
private ObservableCollection<BlockingTreeModel> _parent;
public ObservableCollection<BlockingTreeModel> Parent
{
get { return _parent; }
set
{
_parent = value;
NotifyPropertyChange(() => Parent);
}
}
如何在TreeViewViewModel中设置子节点的
Parent
属性?谢谢你。
最佳答案
您不能为此使用Object Initializer语法。
像这样更改它:
private TreeModel createNewNode()
{
var newNode = new TreeModel();
newNode.Children.Add(new BlockingTreeModel() {Parent = newNode});
return newNode;
}
另外,您的对象模型对我来说似乎是错误的。在树状结构中,项目可能有N个子级,但只有1(一)个父级。因此,应按以下方式定义您的
Parent
属性:private TreeModel _parent;
public TreeModel Parent
{
get { return _parent; }
set
{
_parent = value;
NotifyPropertyChange(() => Parent);
}
}
-------------------------------------------------- -----------------------------------------
另外,您可以覆盖
ObservableCollection
的Add()
方法,并对添加的每个项目执行一些操作,如下所示:public class HierarchicalObservableCollection<TParent, TItems> : ObservableCollection<TItems>
{
public TParent Parent { get; protected set; }
public Action<TItems, TParent> ItemParentSetter { get; protected set; }
public HierarchicalObservableCollection(TParent parent, Action<TItems, TParent> parentSetter)
{
Parent = parent;
ItemParentSetter = parentSetter;
}
public new void Add(TItems item)
{
if (item != null)
ItemParentSetter(item, Parent);
base.Add(item);
}
}
然后,您的
TreeModel
类可以更改为:public class TreeModel
{
public TreeModel Parent { get; set; }
public HierarchicalObservableCollection<TreeModel, TreeModel> Children { get; set; }
public TreeModel()
{
Children = new HierarchicalObservableCollection<TreeModel, TreeModel>(this, (i, p) => i.Parent = p);
}
}
然后,这将允许您保留“对象/集合初始化器”的语法,因为您不再需要显式设置子代的父对象(HierarchicalCollection会为您完成此操作):
return new TreeModel()
{
Parent = null,
Children =
{
new BlockingTreeModel() // <- this will call Add() which will set the Parent too.
};
关于c# - 如何为子级TreeView节点设置父级值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19916178/