C# 如何为子树视图节点设置父值
在我的程序中,我有一个通过MVVM结构实现的C# 如何为子树视图节点设置父值,c#,wpf,mvvm,treeview,C#,Wpf,Mvvm,Treeview,在我的程序中,我有一个通过MVVM结构实现的TreeView。我在这棵树的数据模型中实现了一个Parent属性,但不知道如何设置子级的父级 TreeView模型: private TreeModel createNewNode() { return new TreeModel() { Parent = null, Children = { new BlockingTreeModel() { Parent =
TreeView
。我在这棵树的数据模型中实现了一个Parent
属性,但不知道如何设置子级的父级
TreeView模型:
private TreeModel createNewNode()
{
return new TreeModel()
{
Parent = null,
Children =
{
new BlockingTreeModel() { Parent = ?? }
};
}
private ObservableCollection<BlockingTreeModel> _parent;
public ObservableCollection<BlockingTreeModel> Parent
{
get { return _parent; }
set
{
_parent = value;
NotifyPropertyChange(() => Parent);
}
}
TreeModel:
private TreeModel createNewNode()
{
return new TreeModel()
{
Parent = null,
Children =
{
new BlockingTreeModel() { Parent = ?? }
};
}
private ObservableCollection<BlockingTreeModel> _parent;
public ObservableCollection<BlockingTreeModel> Parent
{
get { return _parent; }
set
{
_parent = value;
NotifyPropertyChange(() => Parent);
}
}
private observedcollection\u父对象;
公共可观测集合父级
{
获取{return\u parent;}
设置
{
_父=值;
NotifyPropertyChange(()=>Parent);
}
}
如何在TreeView模型中设置子节点的父属性
谢谢。您不能使用此语法
这样改变它:
private TreeModel createNewNode()
{
var newNode = new TreeModel();
newNode.Children.Add(new BlockingTreeModel() {Parent = newNode});
return newNode;
}
而且,在我看来,您的对象模型是错误的。在树状结构中,项可能有N个子项,但只有1(一)个父项。因此,您的父属性应定义如下:
private TreeModel _parent;
public TreeModel Parent
{
get { return _parent; }
set
{
_parent = value;
NotifyPropertyChange(() => Parent);
}
}
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);
}
}
-------------------------------------------------------------------------------------------
或者,您可以覆盖observateCollection
的Add()
方法,并对每个添加的项执行一些操作,如下所示:
private TreeModel _parent;
public TreeModel Parent
{
get { return _parent; }
set
{
_parent = value;
NotifyPropertyChange(() => Parent);
}
}
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);
}
}
这将允许您保留对象/集合初始值设定项语法,因为您不再需要显式设置子对象的父对象(HierarchycalCollection正在为您执行此操作):
returnnewtreemodel()
{
Parent=null,
孩子们=
{
new BlockingTreeModel()//您不能对此使用语法
这样改变它:
private TreeModel createNewNode()
{
var newNode = new TreeModel();
newNode.Children.Add(new BlockingTreeModel() {Parent = newNode});
return newNode;
}
此外,我认为您的对象模型是错误的。在树状结构中,项可能有N个子项,但只有1(一)个父项。因此,您的父属性应定义如下:
private TreeModel _parent;
public TreeModel Parent
{
get { return _parent; }
set
{
_parent = value;
NotifyPropertyChange(() => Parent);
}
}
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);
}
}
-------------------------------------------------------------------------------------------
或者,您可以覆盖observateCollection
的Add()
方法,并对每个添加的项执行一些操作,如下所示:
private TreeModel _parent;
public TreeModel Parent
{
get { return _parent; }
set
{
_parent = value;
NotifyPropertyChange(() => Parent);
}
}
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);
}
}
这将允许您保留对象/集合初始值设定项语法,因为您不再需要显式设置子对象的父对象(HierarchycalCollection正在为您执行此操作):
returnnewtreemodel()
{
Parent=null,
孩子们=
{
新BlockingTreeModel()//您不能对此使用对象初始值设定项语法。您是针对属性吗?您不能对此使用对象初始值设定项语法。您是针对属性吗?很好,这是一个很好的答案。非常感谢!@EricAfterDark查看我的备选解决方案。很好,这是一个很好的答案。非常感谢!@EricAfterDark查看我的备选方案粘连。