我目前正在开发 WPF TreeView 显示。这个TreeView的内容来自普通的Data Binding:
<TreeView HorizontalAlignment="Stretch"
x:Name="LogMonitor"
VerticalAlignment="Stretch"
ItemsSource="{Binding LogEntries, UpdateSourceTrigger = PropertyChanged }">
<TreeView.Resources>
<HierarchicalDataTemplate
DataType="{x:Type Log:SystemLog}"
ItemsSource="{Binding Path=Lines}">
<TextBlock Text="{Binding Header}"/>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
TreeView 是按关键字过滤的,但我还希望对保留在 TreeView 中的所有 TreeViewItem 进行关键字突出显示。
例如,如果有一个带有标题“This is an apple”的 TreeViewItem,并且用户键入“apple”作为过滤关键字,它应该显示一个 TreeViewItem,如下所示:
我尝试了一些方法,但运气不佳。
使用内置样式:
突出显示需要字符串匹配并将颜色块放在匹配的子字符串下方。似乎没有可以这样装扮的内置样式模板。在 ViewModel 对象中绘制到画布并将画布绑定到 TreeViewItem :
它仅在未选择 TreeViewItem 时有效,一旦选择,内置的绘制调用无法找到以“突出显示”样式绘制画布的方法并离开一个空白区域。创建 TreeViewItem 的子类并重写 OnRender 函数,然后替换 TreeView 的 ItemContainerGenerator 以返回我的 TreeViewItem 子类:
不可能,TreeView 的 ItemContainerGenerator 不可设置且非虚拟。而且我只能想到另一种选择:
放弃Data Binding,自己将重写了OnRender函数的TreeViewItem的子类推入TreeView的Items列表中。
它在实验中给了我积极的结果。但我对放弃数据绑定范式感到不舒服。所以我想问有没有其他方法可以用数据绑定礼物来做所有者绘制。
谢谢你。