做主人绘制数据绑定生成的WPF项目

时间:2012-11-20 02:26:35

标签: c# wpf data-binding treeview treeviewitem

我目前正在开发WPF TreeView显示器。此TreeView的内容来自普通的数据绑定:

<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进行关键字突出显示。

例如,如果有一个带有标题“这是一个苹果”的TreeViewItem,并且用户输入“apple”作为过滤关键字,它应该显示一个TreeViewItem看起来像:

Highlight

我尝试了一些方法,但没有太多运气。

  1. 使用内置样式:
    突出显示需要字符串匹配并将颜色块放在匹配的子字符串下面。似乎没有可以通过这种方式打扮的内置样式模板。

  2. 在ViewModel对象中绘制到画布并将画布绑定到TreeViewItem:
    它仅在未选择TreeViewItem时有效,一旦选中,内置绘制调用无法找到以“突出显示”样式绘制画布的方法,只留下空白区域。

  3. 创建TreeViewItem的子类并覆盖OnRender函数,然后替换TreeView的ItemContainerGenerator返回我的TreeViewItem的子类:
    不可能,TreeView的ItemContainerGenerator不可设置且非虚拟。

    我只能想到另一个选择:

  4. 放弃数据绑定,将TreeViewItem的子类与覆盖的OnRender函数一起推送到TreeView的Items列表中。

  5. 它给了我实验的积极结果。但是我对放弃数据绑定范例感到不舒服。所以我想问一下,有没有其他方法可以使用数据绑定提示进行所有者绘制。

    谢谢。

1 个答案:

答案 0 :(得分:0)

创建一个用户控件,将文本分成3个区域:高亮显示,高亮显示和高亮显示。您可以使用标准绑定和样式完成所有操作。每个TreeViewItem都是这些控件之一。