为什么在 DataTemplate 中使用 UserControl 比直接 xaml 慢?

Why using UserControl inside DataTemplate is slower than direct xaml?

我有这样的代码:

<ListBox ItemsSource="{Binding Items}">
    <ListBox.ItemTemplate>
        <DataTemplate DataType="{x:Type local:MyViewModel}">

           <!-- xaml is typed here directly -->
           <Border>
               ...
           </Border>

        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

而且xaml里面的DataTemplate很大(超过200行)。

我想将 DataTemplate 中的 xaml 移动到单独的 UserControl 中,以便于编辑和维护。接下来我做:

<ListBox ItemsSource="{Binding Items}">
    <ListBox.ItemTemplate>
        <DataTemplate DataType="{x:Type local:MyViewModel}">

            <!-- xaml is moved to separate UserControl -->
            <local:MyViewModelUserControl />

        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

我 运行 遇到的问题是 rendering/processing 第二个代码(使用 UserControl)比第一个代码花费大约 2 倍的时间。任何想法如何处理它?

注意:我移动的不是 ListBox,而是 DataTemplate 中的 xaml。原因不是为了重用这段代码,而是为了最小化放置ListBox的主文件。另一件事是我在 ListBox 中有几个 DataTemplates(用于几个 ViewModels)并且 xaml 真的很大。这就是为什么我想将此 xaml(位于 DataTemplate 内)移动到单独的控件。

在我看来,如果您只在一个地方使用这个列表框,那么现在没有必要将列表框分离到一个单独的用户控件中。 无论如何,如果您非常关心优化代码和创建可重用控件,那么您可以创建一个单独的 UserControl。但是你不能为可重用的用户控件提供视图模型,因为它是基于视图的东西。

您必须将列表框的必需属性绑定到 Dependency Properties,然后创建 UserControl。通过这样做,您不会违反 MVVM 模式,并且您可以让其他人重用控件。

造成延迟的原因不是您的行为。这可能是由于数据获取时间或其他一些进程导致应用程序滞后。

我知道这是一个老问题,但我最近也 运行 研究过这个问题。在 WPF 中创建用户控件的开销很大,这似乎来自将代码隐藏 class 文件连接到 XAML。如果您只想将 XAML 移动到另一个位置,只需在另一个文件的 ResourceDictionary 中定义 DataTemplate,然后将其加载为 StaticResource。这将提供一些优势:

(1) 可以对元素使用 x:Name,这在内联 DataTemplate.

中是不允许的

(2) 性能。直接 XAML 的 DataTemplateDataTemplate.

中的 UserControl 快几个数量级

(3) 清洁度。您可以在任何您喜欢的地方定义 DataTemplate(同一文件中的资源字典、您正在使用它的位置附近、不同的文件等)并将其称为 StaticResource.

您可以简化 "MyViewModelUserControl" - 您可以直接从 Border 继承,而不是从 UserControl 继承,并且在其 XAML 中也这样做(Border 而不是 UserControl 作为根元素)。这将为您提供与以前相同的性能,但您可以将其保存在单独的控件中。