Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为子树视图节点设置父值_C#_Wpf_Mvvm_Treeview - Fatal编程技术网

C# 如何为子树视图节点设置父值

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 =

在我的程序中,我有一个通过MVVM结构实现的
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查看我的备选方案粘连。