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

时间:2016-07-27 10:27:43

标签: wpf performance user-controls datatemplate

我有这样的代码:

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

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

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

DataTemplate中的xaml很大(超过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>

我遇到的问题是渲染/处理第二个代码(使用UserControl)比第一个代码长约2倍。任何想法如何处理它?<​​/ p>

注意:我不是移动ListBox,而是移动DataTemplate内部的xaml。原因不是重用此代码,而是最小化放置ListBox的主文件。另一件事是我在ListBox中有几个DataTemplates(对于几个ViewModel)而且xaml非常庞大。这就是我想将这个xaml(在DataTemplate中)移动到一个单独的控件的原因。

3 个答案:

答案 0 :(得分:1)

在我看来,如果你只在一个地方使用这个ListBox,就不需要将Listbox分离成一个单独的UserControl。 无论如何,如果您非常关心优化代码和创建可重用控件,那么您可以创建单独的UserControl。但是你不能拥有一个可重用的usercontrol的viewmodel,因为它是一个基于视图的东西。

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

造成的延误不是由于你做了什么。这可能是由于数据获取时间或某些其他过程导致应用程序滞后。

答案 1 :(得分:1)

我知道这是一个老问题,但我最近也遇到了这个问题。在WPF中创建用户控件有很大的开销,这似乎来自将代码隐藏类文件连接到XAML。如果你要做的就是将XAML移到另一个位置,只需在另一个文件的DataTemplate中定义ResourceDictionary,然后将其加载为StaticResource即可。这将提供一些优势:

(1)能够将x:Name用于元素,这在内联DataTemplate中是不允许的。

(2)表现。直接XAML的DataTemplateUserControl中的DataTemplate快几个数量级。

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

答案 2 :(得分:0)

您可以简化“ MyViewModelUserControl”,而不是直接继承UserControl,而不必继承Border,也可以通过其XAML(Border而不是{{1} }作为根元素)。这样可以为您提供与以前相同的性能,但是您可以将其保存在单独的控件中。