绑定与x:绑定,使用StaticResource作为默认值以及它们在DataContext中的差异
我花了半天时间尝试使用UserControl
创建ListView
的ItemTemplate
,并通过所述UserControl
上的DependencyProperty
进行配置。 关于Windows 10 UAP平台上可用的两种不同Binding
方法( Binding
和x:Bind
),我遇到了一些奇怪的不一致。
UserControl
看起来像这样,是自定义日历组件的一部分。
EventItemTemplate
是UserControl
的DependencyProperty
。
public DataTemplate EventItemTemplate { get { return (DataTemplate)GetValue(EventItemTemplateProperty); } set { SetValue(EventItemTemplateProperty, value); } } public static readonly DependencyProperty EventItemTemplateProperty = DependencyProperty.Register("EventItemTemplate", typeof(DataTemplate), typeof(CalendarDayView), new PropertyMetadata(null));
在其中一个根页面上进行了更改,以便以某种方式设置ListView
样式,就像这样。
这实际上是一个工作版本,但我不得不修补它。 我使用x:Bind
和Binding
进行了第一次尝试,而在RelativePanel
上没有DataContext
,因为现在是UserControl
。 x:Bind
在根页面EventItemTemplate
值设置为EventItemTemplate
时, x:Bind
将起作用,但是当根页面未指定任何内容时,它将无法使用StaticResource
指定的默认DataTemplate
。 另一方面, Binding
将始终使用默认的DataTemplate
,即使根页面设置了EventItemTemplate
的其他值EventItemTemplate
。
通过将RelativePanel
上的DataContext
设置为UserControl
Binding
开始工作就像想要它一样。 x:Bind
仍显示相同的行为。
现在我明白Binding
默认情况下不会绑定到UserControl
的DataContext
,但我仍然不完全确定为什么x:Bind
不起作用。 这是预期的行为,还是我的整个计划出现了问题,是我想出的一个幸运的黑客行为?
来自{x:Bind}标记扩展 :
Windows 10的{x:Bind}标记扩展名 – 是{Binding}的替代品。 {x:Bind}缺少{Binding}的一些function,但它比{Binding}在更短的时间和更少的内存中运行,并支持更好的调试。
在XAML加载时,{x:Bind}被转换为您可以将其视为绑定对象的内容,并且此对象从数据源上的属性获取值。 可以选择将绑定对象配置为观察数据源属性值的更改,并根据这些更改自行刷新。 它还可以选择配置为将其自身值的更改推送回源属性。 {x:Bind}和{Binding}创建的绑定对象在function上大致相同。 但是{x:Bind}执行它在编译时生成的专用代码,而{Binding}使用通用运行时对象检查。 因此,{x:Bind}绑定(通常称为编译绑定)具有很好的性能,提供绑定表达式的编译时validation,并支持调试,使您能够在作为部分生成的代码文件中设置断点您的页面的课程。 这些文件可以在obj文件夹中找到,其名称类似于(对于C#).g.cs。