我有这样的代码:
<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中)移动到一个单独的控件的原因。
答案 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的DataTemplate
比UserControl
中的DataTemplate
快几个数量级。
(3)清洁度。您可以在任意位置定义DataTemplate
(同一文件中的资源字典,您使用它的位置附近,不同的文件等),并将其称为StaticResource
。
答案 2 :(得分:0)
您可以简化“ MyViewModelUserControl”,而不是直接继承UserControl
,而不必继承Border
,也可以通过其XAML(Border
而不是{{1} }作为根元素)。这样可以为您提供与以前相同的性能,但是您可以将其保存在单独的控件中。