小编Jer*_*rme的帖子

WPF性能缓慢 - 许多DataItem = null绑定警告

我有一个树形控件表现出非常差的性能,我试图跟踪问题的根源.

我想弄清楚以下警告是否重要:

System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=ContextMenu.IsOpen; DataItem=null; target element is 'MultipleSelectionTreeViewItem' (Name=''); target property is 'NoTarget' (type 'Object')
Run Code Online (Sandbox Code Playgroud)

即使关闭所有这些diags,更新树内容的性能也非常可怕(超过一秒钟重新填充~300项),这就是我开始查看跟踪输出的原因.

在我的树视图中,每次单击时都会显示这些警告,当我切换树以显示不同的内容时,会发生数百个警告.但是,树的内容始终显示正确显示,因此数据上下文必须仅暂时设置为null.

我对DataContext值转换器进行了显式绑定,以尝试查看发生了什么.

<HierarchicalDataTemplate x:Key="HierarchyItemTemplate"
                          DataType="{x:Type local:HierarchyItem}"
                          ItemsSource="{Binding Children}">
    <StackPanel DataContext="{Binding Converter={StaticResource DbgConverter}}" Orientation="Horizontal">
       ...
    </StackPanel>
</HierarchicalDataTemplate>
Run Code Online (Sandbox Code Playgroud)

...但是值似乎永远不等于null进入那里.

我可以为所有绑定设置一个回退值来摆脱这些警告,但这会在xaml中造成很多不必要的混乱,并且似乎隐藏了问题而不是解决它(假设它甚至是一个问题!).

所以我的问题是:

  1. 这些诊断是否可能导致性能问题?
  2. 如果是这样,当关闭诊断时,提供回退值是否会对性能产生任何影响?
  3. 如果是这样,有没有比用crud填充xaml更好的方法呢?

编辑

使用回退值看起来似乎不是解决方案,因为它也无法找到资源:

System.Windows.ResourceDictionary Warning: 9 : Resource not found; ResourceKey='Img_Folder_Closed_Ex'
Run Code Online (Sandbox Code Playgroud)

这就像它忘记了资源字典中的所有内容,生成所有这些虚假错误,然后再次记住它并显示确定.

编辑

好吧,我已经通过评论所有绑定并将它们一个接一个地放回原点来解决这个问题并解决问题,所以现在加载它我可以点击这些项目并且不会产生任何诊断直到..当我点击更改树项目的按钮时,它会变得疯狂并喷出数百个错误.以下是错误的一小部分:

System.Windows.Data Information: 21 : BindingExpression cannot retrieve value …
Run Code Online (Sandbox Code Playgroud)

data-binding wpf performance hierarchicaldatatemplate

13
推荐指数
1
解决办法
5240
查看次数