5

我实现了一个 WPF 按需加载树视图,如这篇(非常好的)文章中所述。在提到的解决方案中,一个虚拟元素用于保留展开+图标/树视图项目的行为。当用户单击扩展器时,虚拟项目将替换为真实数据。

我想通过public bool HasChildren { get { ... } }在我的支持中添加一个属性来优化模型TreeNodeViewModel

问题:
如何绑定此属性以隐藏/显示展开图标(在 XAML 中)?我找不到合适的触发器/设置器组合。
(INotifyPropertyChanged 已正确实施。)

谢谢你的时间。

更新 1:
我想使用我的属性public bool HasChildren 而不是使用虚拟元素。
确定一个项目是否有孩子有点昂贵,但仍然比获取孩子便宜得多。

4

2 回答 2

1

在快速查看 Josh 的代码后,我发现了这个构造函数:

protected TreeViewItemViewModel(TreeViewItemViewModel parent, bool lazyLoadChildren)
{
    _parent = parent;

    _children = new ObservableCollection<TreeViewItemViewModel>();

    if (lazyLoadChildren)
        _children.Add(DummyChild);
}

因此,如果您从继承的 ViewModel 类中传递false参数lazyLoadChildren,则不应出现 + 图标,因为未添加 DummyChild。由于您似乎知道您的项目是否有子项,因此您应该能够为该lazyLoadChildren属性传递适当的值。还是我错过了什么?

于 2010-04-19T15:57:14.170 回答
1

朱利安,

这是一个非常好的问题。为什么不尝试编写自己的树视图项?:) 我的意思是,不是从头开始,只是从现有的 TreeViewItem 派生并添加您的属性。我已经准备了一个快速示例,但您可以随意修改它(如果有不完全清楚的地方,请提出问题)。开始了:

public class TreeViewItem_CustomControl : TreeViewItem
{
    static TreeViewItem_CustomControl()
    {
        HasChildrenProperty = DependencyProperty.Register("HasChildren", typeof(Boolean), typeof(TreeViewItem_CustomControl));
    }

    static DependencyProperty HasChildrenProperty;

    public Boolean HasChildren
    {
        get
        {
            return (Boolean)base.GetValue(HasChildrenProperty);
        }

        set
        {
            if (value)
            {
                if (this.Items != null)
                {
                    this.Items.Add(String.Empty); //Dummy item
                }
            }
            else
            {
                if (this.Items != null)
                {
                    this.Items.Clear();
                }
            }

            base.SetValue(HasChildrenProperty, value);
        }

    }
}

这是您的自定义 TreeViewItem 的代码。现在让我们在 XAML 中使用它:

<TreeView>
    <TreeViewItem Header="qwer">
        Regulat tree view item.
    </TreeViewItem>
    <CustomTree:TreeViewItem_CustomControl x:Name="xyz" Header="temp header" Height="50">
        <TreeViewItem>Custom tree view item, which will be removed.</TreeViewItem>
    </CustomTree:TreeViewItem_CustomControl>
</TreeView>

如您所见,第一项是常规项,第二项是您的自定义项。请注意,它有一个孩子。接下来,您可以将HasChildren属性绑定到 ViewModel 中的某个 Boolean 对象,或者只是通过在上述 XAML 后面的代码中将HasChildren 设置为False来测试我的自定义类:

xyz.HasChildren = false;

现在,尽管您的元素有一个子元素,但未显示展开按钮,这意味着我的自定义类有效。

我希望我对您有所帮助,但如果您有任何问题,请随时询问。

彼得。

于 2010-04-21T13:20:54.127 回答