如何在呈现父对象时阻止构造UserControl?

时间:2015-04-08 15:27:59

标签: wpf wpf-controls

我一直在努力提高ItemsControl的滚动性能。最初,每个项目都是一行简单的信息,当单击某个项目时,会在项目下方展开详细的UserControl。我正在尝试消除滚动期间对详细UserControl进行的处理。我最终用CustomControl实现了这一点,但我觉得我必须错过一种更简单的方法来使用现有的框架控件。

最初,此详细信息视图是具有Visibility.Collapsed的UserControl。我应该注意,此ItemsControl启用了虚拟化和回收。因此,滚动性能很差,因为当项目滚动到视图中时,每个细节视图都绑定到数据,即使细节不可见。

然后我尝试使用ContentPresenter,其中Content绑定到DetailViewModel属性,ContentTemplate设置为键控DataTemplate。将DetailViewModel属性初始化为Nothing,然后在单击该项时将其设置为相应的ViewModel对象。这提高了滚动性能,因为没有数据绑定,但我发现UserControl的细节仍然是为每个项目构建的,我认为还有一些渲染正在进行。

我最终使用自定义ContentControl获得了所需的行为,该自定义ContentControl为GatedContentTemplateIsGateOpen提供了依赖项属性。当IsGateOpen转到True时,GatedContentTemplate会传递到ContentTemplate属性,Content会设置为控件的DataContext,导致内容随后被构造,渲染和绑定。

<my:GatedContentControl IsGateOpen="{Binding IsDetailVisible}">
    <my:GatedContentControl.GatedContentTemplate>
        <DataTemplate>
            <my:DetailUserControl/>
        </DataTemplate>
    </my:GatedContentControl.GatedContentTemplate>
</my:GatedContentControl>

我可以忍受这个解决方案,但它有点笨拙,我想知道我是否错过了WPF打算这样做的方式。

1 个答案:

答案 0 :(得分:1)

看起来我没有遗漏任何东西,这是微软在.net 4.6中解决的问题。

此视频中讨论了内容延迟功能,从26:30开始。 http://channel9.msdn.com/Events/dotnetConf/2015/WPF-in-46-and-beyond

感谢评论HighCore。