1

在我的程序中,我有一个TreeView通过 MVVM 结构实现的。我已经Parent在这棵树的数据模型中实现了一个属性,但不知道如何设置孩子的父母。

树视图视图模型:

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);
    }
}

如何Parent在 TreeViewViewModel 中设置子节点的属性?

谢谢你。

4

1 回答 1

1

您不能为此使用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'sAdd()方法,并对每个添加的项目执行一些操作,如下所示:

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);
    }
}

这将允许您保留 Object / Collection Initializer 语法,因为您不再需要显式设置 Children's Parent(HierarchicalCollection 正在为您执行此操作):

return new TreeModel()
{
    Parent = null,
    Children =
    {
        new BlockingTreeModel() // <- this will call Add() which will set the Parent too.
    };
于 2013-11-11T21:24:02.110 回答