Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在数据绑定生成的WPF项中进行所有者绘制_C#_Wpf_Data Binding_Treeview_Treeviewitem - Fatal编程技术网

C# 在数据绑定生成的WPF项中进行所有者绘制

C# 在数据绑定生成的WPF项中进行所有者绘制,c#,wpf,data-binding,treeview,treeviewitem,C#,Wpf,Data Binding,Treeview,Treeviewitem,我目前正在WPF TreeView显示器上工作。此树视图的内容来自普通数据绑定: <TreeView HorizontalAlignment="Stretch" x:Name="LogMonitor" VerticalAlignment="Stretch" ItemsSource="{Binding LogEntries, UpdateSourceTrigger = PropertyChanged }"> <TreeView.Re

我目前正在WPF 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中的所有TreeView项目进行关键字突出显示

例如,如果有一个标题为“This is a apple”且用户键入“apple”作为筛选关键字的TreeView项目,则它应该显示一个TreeView项目,如下所示:

我尝试了一些方法,但运气不太好

  • 使用内置样式:
    高亮显示需要字符串匹配并将颜色块放置在匹配的子字符串下面。似乎没有内置的样式模板可以按照这种方式进行装饰

  • 在ViewModel对象中绘制到画布并将画布绑定到TreeViewItem:
    它仅在未选择TreeViewItem时起作用,一旦选择,内置的draw调用无法找到以“highlight”样式绘制画布的方法,只留下一个空白区域

  • 创建TreeViewItem的子类并重写OnRender函数,然后替换TreeView的ItemContainerGenerator以返回我的TreeViewItem子类:
    不可能,TreeView的ItemContainerGenerator不可设置且非虚拟

    我只能想到另外一个选择:

  • 放弃数据绑定,将带有重写OnRender函数的TreeView子类推送到TreeView的项目列表中

  • 它在实验中给了我积极的结果。但我对放弃数据绑定范式感到不安。所以我想问一下,是否有其他方法可以使用数据绑定呈现进行所有者绘制


    谢谢。

    创建一个用户控件,将文本分为3个区域:预高亮、高亮和后高亮。您可以通过标准绑定和样式来完成这一切。每个TreeViewItem都是这些控件之一

    UpdateSourceTrigger=PropertyChanged
    更改为单向绑定是没有意义的:我将使用Snoop检查视觉层,看看是否有装饰层,我可以使用它将红色矩形添加到树视图上方,但节点文本下方。我不知道TreeView的装饰层是否是解决方案。我发现Snoop是一个神奇的工具。非常感谢。虽然我还没有找到一个像样的方法来做我想做的事。我尝试的方向是覆盖TreeView的GetContainerForItemOverride并返回我想要的子类。然后在TreeViewItem子类中执行OnRender覆盖。它不知怎的起作用了,但是有几个小毛病我很难摆脱。只是为了讨论,如果关键字在同一个文本中出现两次呢?很好。使用这种方法时,我们没有这种情况。另一个想法是使用StackPanel,用适当样式的文本块填充。也许在物业变更时填写。