我一直在努力提高ItemsControl的滚动性能。最初,每个项目都是一行简单的信息,当单击某个项目时,会在项目下方展开详细的UserControl。我正在尝试消除滚动期间对详细UserControl进行的处理。我最终用CustomControl实现了这一点,但我觉得我必须错过一种更简单的方法来使用现有的框架控件。
最初,此详细信息视图是具有Visibility.Collapsed的UserControl。我应该注意,此ItemsControl启用了虚拟化和回收。因此,滚动性能很差,因为当项目滚动到视图中时,每个细节视图都绑定到数据,即使细节不可见。
然后我尝试使用ContentPresenter,其中Content绑定到DetailViewModel属性,ContentTemplate设置为键控DataTemplate。将DetailViewModel属性初始化为Nothing,然后在单击该项时将其设置为相应的ViewModel对象。这提高了滚动性能,因为没有数据绑定,但我发现UserControl的细节仍然是为每个项目构建的,我认为还有一些渲染正在进行。
我最终使用自定义ContentControl获得了所需的行为,该自定义ContentControl为GatedContentTemplate
和IsGateOpen
提供了依赖项属性。当IsGateOpen
转到True
时,GatedContentTemplate
会传递到ContentTemplate
属性,Content
会设置为控件的DataContext
,导致内容随后被构造,渲染和绑定。
<my:GatedContentControl IsGateOpen="{Binding IsDetailVisible}">
<my:GatedContentControl.GatedContentTemplate>
<DataTemplate>
<my:DetailUserControl/>
</DataTemplate>
</my:GatedContentControl.GatedContentTemplate>
</my:GatedContentControl>
我可以忍受这个解决方案,但它有点笨拙,我想知道我是否错过了WPF打算这样做的方式。
答案 0 :(得分:1)
看起来我没有遗漏任何东西,这是微软在.net 4.6中解决的问题。
此视频中讨论了内容延迟功能,从26:30开始。 http://channel9.msdn.com/Events/dotnetConf/2015/WPF-in-46-and-beyond
感谢评论HighCore。