如何防止在呈现其父项时构建 UserControl?

How can you prevent a UserControl from being constructed when its parent is rendered?

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

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

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

我最终通过为 GatedContentTemplateIsGateOpen 提供依赖属性的自定义 ContentControl 获得了所需的行为。当 IsGateOpen 变为 True 时,GatedContentTemplate 被传递给 ContentTemplate 属性 并且 Content 被设置为 DataContext控件,它会导致内容被构造、呈现和绑定。

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

我可以接受这个解决方案,但它有点笨拙,我想知道我是否遗漏了 WPF 打算完成此操作的某些方法。

看起来我没有遗漏任何东西,这是 Microsoft 在 .net 4.6 中解决的需求。

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

感谢 HighCore 的评论。