c# - 如何为子级TreeView节点设置父级值

标签 c# wpf mvvm treeview

在我的程序中,我有一个通过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);
    }
}

-------------------------------------------------- -----------------------------------------

另外,您可以覆盖ObservableCollectionAdd()方法,并对添加的每个项目执行一些操作,如下所示:
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/

相关文章:

c# - WPFToolkit CheckComboBox 宽度问题

ios - 使用 RxSwift 将 UITableViewCell 中的控件绑定(bind)到 ViewModel 的最佳实践

c# - WPF - 具有 MultiBinding 和不同 DataContexts 的自定义工具提示

c# - 最小化应用程序时捕获媒体键

wpf - WPF 工具栏中的下拉菜单

c# - 在 XBAP 应用程序中包含外部文件

c# - EventToCommand 永远不会被触发 - MVVM

c# - 无法访问该文件,因为它正被另一个进程使用

c# - 在 PictureBox 上画线

c# - DI 设计模式的值对象是否有效依赖?