我实现了一个WPF按需加载树视图,如this(非常好)文章中所述。
在上述解决方案中,虚拟元素用于保留展开+
图标/树视图项行为。当用户点击扩展器时,虚拟项目将替换为实际数据。
我想通过向我的支持public bool HasChildren { get { ... } }
添加属性TreeNodeViewModel
来优化模型。
问题:
如何绑定此属性以隐藏/显示展开图标(在XAML中)?我无法找到合适的触发/设定器组合
(正确实现了INotifyPropertyChanged。)
感谢您的时间。
更新1:
我想使用我的属性public bool HasChildren
而不是使用虚拟元素
确定一件物品是否有孩子有点贵,但仍然比拿孩子便宜得多。
答案 0 :(得分: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 属性绑定到ViewModel中的某个Boolean对象,或者只是通过将HasChildren设置为上面XAML后面的代码中的 False 来测试我的自定义类:
xyz.HasChildren = false;
现在,尽管你的元素有一个子元素,但是不显示expand按钮,这意味着我的自定义类可以工作。
我希望我能帮到你,但你可以随意问你是否有任何问题。
彼得。
答案 1 :(得分:1)
在快速查看Josh的代码之后,我找到了这个构造函数:
protected TreeViewItemViewModel(TreeViewItemViewModel parent, bool lazyLoadChildren)
{
_parent = parent;
_children = new ObservableCollection<TreeViewItemViewModel>();
if (lazyLoadChildren)
_children.Add(DummyChild);
}
因此,如果从继承的ViewModel类传递false
lazyLoadChildren
参数,则不应显示+图标,因为未添加DummyChild。由于您似乎知道您的项目是否有子项,因此您应该能够为lazyLoadChildren
属性传递适当的值。或者我错过了什么?