WPF 数据模板在高 CPU 负载时与数据类型不匹配



这是我的代码

<TreeView x:Name="MyTreeView" ItemsSource="{Binding MyDataList}" Grid.Row="0" ScrollViewer.VerticalScrollBarVisibility="Auto">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type vm:ParentDataType}" ItemsSource="{Binding ChildsList}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}"/>
<TextBlock Text=" [" Foreground="Blue"/>
<TextBlock Text="{Binding ChildsList.Count}" Foreground="Blue"/>
<TextBlock Text="]" Foreground="Blue"/>
</StackPanel>
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type vm:ChildDataType}">
<uc:UCScheduleView DataContext="{Binding}" Visibility="{Binding IsResultLoad, Mode=OneWay, Converter={StaticResource BoolVisibilityConverter}}"/>
</DataTemplate>
</TreeView.Resources>
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}"/>
</Style>
</TreeView.ItemContainerStyle>

如您所见,我有一个TreeView,并使用HierarchicalDataTemplateDataTemplate来显示我的数据。

此 XAML 代码工作正常。结果,我得到了一棵树,其中包含ParentDataType类型的一级元素和ChildDataType类型的二级元素。

但是当 CPU 负载较高时,HierarchicalDataTemplate停止匹配DataType,我在树的第一级TreeView中得到"MyModule.ViewModel.ParentDataType"(这是在ParentDataType实例上ToString()的结果)。

但这还不是全部。问题随机发生。应用程序启动后,树为空。我可以将数据库中ParentDataType类型的第一个元素添加到MyDataList并将第一级元素添加到树中。因此,如果第一次加载成功,那么从数据库加载所有其他数据不会导致问题,一切都会好起来的。但是,如果在首次从数据库加载时出现问题,则从数据库加载所有其他数据也不会导致问题。因此,该问题可能仅在从数据库加载第一个数据项时发生,并且在重新启动应用程序之前不会发生。

因此,我描述了问题发生时的情况。如问题标题中所述,仅当 CPU 负载较高时,才会出现问题。我按照此处所述模拟 CPU 负载,当 ~75% CPU 负载时出现问题。

看起来高 CPU 使用率会干扰 WPF,因此 WPF 在应用数据模板时跳过数据类型比较并执行ToString()尽管存在数据类型属性...

您应该使用虚拟化。也许 WPF 只是停止呈现模板,只显示字符串表示形式。

https://msdn.microsoft.com/en-us/library/cc716879

最新更新