RelativeSource TemplatedParent

时间:2014-07-10 15:16:45

标签: wpf data-binding

如果我有这个模板

<DataTemplate>
  <TextBlock Visibility="{Binding Path=SomePath, RelativeSource={RelativeSource TemplatedParent}, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource BooleanToVisibilityConverter}}"/>
</DataTemplate>

和这个模板

<DataTemplate>
  <TextBlock Visibility="{Binding Path=Source.SomePath, Converter={StaticResource BooleanToVisibilityConverter}}"/>
</DataTemplate>

从表现来看,两者之间是否存在显着差异?

让我们假设此模板用于网格控制单元格,因此将显示多个TextBlocks(单元格)实例。

根据MSDN,TemplatedParent枚举将解析为静态值,在我看来,这意味着它只会为所有单元格解析一次。这应该意味着两种方法之间的差异应该非常小,性能明智。

我的假设是否正确?

1 个答案:

答案 0 :(得分:0)

你的假设几乎是正确但不完全正确。

鉴于模板在Grid模板中使用且DataTemplate被多次使用,那么它只会根据您要自定义的父模板解析一次,但如果值为SomePath更改后,拥有此模板的单元格数量 将对TemplateParent的值进行N次调用。

假设Source是网格的DataContext,这样做会导致多次调用与TemplateBinding完全相同。当基础值发生变化时,同样适用

结论:根据我的经验,两者之间没有显着的性能差异,因为它们的调用次数相同,具体取决于它的使用方式,如绑定的模式,updatesourcetrigger等

TemplateBinding通常用于创建自定义控件,该控件具有您自己的自定义DependencyProperties和相应的ControlTemplates。因此,如果您希望子控件继承父级的值,它们就很方便。

您的第二个示例可以解释为此控件只绑定到ViewModel并说“嘿,我知道子控件需要绑定到名为{{的ViewModel中的属性1}}。“,不能与其他SomePath

一起使用