2010-04-19 373 views
4

我实现了一个WPF按需树形视图,如this(非常好)文章中所述。 在上述解决方案中,使用虚拟元素来保留图标/树视图项目行为的扩展+。当用户点击扩展器时,虚拟项目被替换为实际数据。WPF TreeView数据绑定隐藏/显示展开/折叠图标

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

问:
我如何可以绑定这个属性为隐藏/显示扩展图标(XAML)?我无法找到合适的触发器/设置器组合。
(INotifyPropertyChanged正确实施。)

感谢您的时间。

更新1:
我想用用虚设的元素的我的财产public bool HasChildren代替
确定一件物品是否有孩子有点贵,但仍比取孩子便宜。

回答

2

朱利安,

这是一个非常好的问题。你为什么不尝试编写自己的树视图项目? :)我的意思是,不是从头开始,只是从现有的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属性绑定到一些布尔对象在你的视图模型或只是简单地通过设置HasChildren从代码测试我的自定义类来上述XAML背后:现在

xyz.HasChildren = false; 

,尽管你的元素有一个孩子,展开按钮不显示,所以这意味着,我的自定义类工作。

我希望我帮你,但随时问,如果你有任何问题。

Piotr。

1

后迅速寻找到Josh的代码,我发现这个构造:

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

    _children = new ObservableCollection<TreeViewItemViewModel>(); 

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

所以,如果你通过false从你继承的ViewModel类lazyLoadChildren参数,+图标不应该出现,因为DummyChild不添加。由于您似乎知道您的物品是否有子女,因此您应该能够通过lazyLoadChildren财产的适当价值。或者我错过了什么?