首先,如果你纯粹想使用在不同的组件使用x:Bind
相同DataTemplate
,你不必包装所有的元素在任何一个用户控件或自定义控件。
你只需要创建一个名为Templates.xaml
资源字典,其中包括所有的数据模板,你想分享,以及一个cs
类具有相同的名称所示(x:Bind
!) -
public partial class Templates
{
public Templates()
{
InitializeComponent();
}
}
然后在你的Templates
资源字典中,添加一个x:Class
属性指向刚才创建的类 -
<ResourceDictionary x:Class="xxx.Templates" ..>
最后,您将需要合并这一资源字典ionary到您的App.xaml
或父资源字典 -
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Fonts.xaml" />
<ResourceDictionary Source="Brushes.xaml" />
<ResourceDictionary Source="Styles.xaml" />
<local:Templates />
</ResourceDictionary.MergedDictionaries>
现在构建并运行,它应该工作。关于这个话题,请参阅伊戈尔杰出的post,我几年前跟踪了这个话题,这对我来说完美无瑕。我甚至能够在那里创建代码隐藏的东西。
现在回到你的原始问题,将使用UserControl
会损坏性能?
我个人认为在UWP中的答案是NO。
历史上,WPF,使用用户控件虚拟化项目控制内部调用UserControl
内InitializeComponent()
每次创建新的数据模板的时候,所以人们倾向于使用自定义控件反而导致性能问题。
但是,这已不再是UWP的情况下,无论它是一个用户控件,自定义控件,甚至只是一个Grid
,只要他们有完全相同的子元素,它们将被加载次数相同。这意味着UserControl中的InitializeComponent
只会被调用很少次,直到虚拟化的ListView
有足够的数字才能在整个列表中循环使用。
但请记住,另一个控制包装是一个附加层,它总是会吸取更多的内存。因此,除非您需要模板上的其他逻辑(例如具有依赖项属性来显示/隐藏内容),否则不必提取其内容以放入另一个或自定义控件。
我希望我的解释有道理。
为什么不简单地尝试一下,看它是否会以任何方式影响应用程序的性能? – Clemens
对于dataTemplate的内容您需要代码隐藏类还是自定义视图模型?否则,我认为没有意义创建用户控件。 –
@NahuelIanni我正在使用ViewModel并将grdiview的ItemSource绑定到ViewModel的ObservableCollection属性。我将在多个页面上使用相同的数据模板,这就是为什么我想将其提取到用户控件中的原因。 – touseef