这是我的代码
<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
并使用HierarchicalDataTemplate
和DataTemplate
来显示我的数据。
这个XAML代码工作正常。因此,我得到一棵树,其中包含ParentDataType
类型的第一级元素和类型为ChildDataType
的第二级元素。
但是当CPU负载很高时,HierarchicalDataTemplate
会停止匹配DataType
,我会得到“MyModule.ViewModel.ParentDataType”(这是ToString()
ParentDataType
的结果1}}实例)在我的TreeView
树的第一层。
但这不是全部。问题随机发生。应用程序启动后,树是空的。我可以将数据库中ParentDataType
类型的第一个元素添加到MyDataList
,并将第一级元素添加到树中。因此,如果第一次加载成功,那么从数据库加载所有其他数据不会导致问题,一切都会好的。但是如果在第一次从数据库加载时出现问题,那么从数据库加载所有其他数据也不会导致问题。因此,问题可能仅在从数据库加载第一个数据项时发生,并且在我重新启动应用程序之前不会发生。
所以,我描述了问题发生时的情况。正如问题标题中所提到的,只有在CPU负载较高时才会出现问题。我按照here所述模拟CPU加载,当加载~75%时出现问题。
看起来高CPU使用率会干扰WPF,因此尽管存在DataType属性,但在DataTemplate应用时WPF会跳过数据类型比较并执行ToString()
...
答案 0 :(得分:0)
您应该使用虚拟化。也许WPF只是停止渲染模板而只显示字符串表示。