如果我有这个模板
<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枚举将解析为静态值,在我看来,这意味着它只会为所有单元格解析一次。这应该意味着两种方法之间的差异应该非常小,性能明智。
我的假设是否正确?
答案 0 :(得分:0)
你的假设几乎是正确但不完全正确。
鉴于模板在Grid
模板中使用且DataTemplate
被多次使用,那么它只会根据您要自定义的父模板解析一次,但如果值为SomePath
更改后,拥有此模板的单元格数量 将对TemplateParent的值进行N次调用。
假设Source
是网格的DataContext
,这样做会导致多次调用与TemplateBinding
完全相同。当基础值发生变化时,同样适用
结论:根据我的经验,两者之间没有显着的性能差异,因为它们的调用次数相同,具体取决于它的使用方式,如绑定的模式,updatesourcetrigger等的
TemplateBinding
通常用于创建自定义控件,该控件具有您自己的自定义DependencyProperties
和相应的ControlTemplates
。因此,如果您希望子控件继承父级的值,它们就很方便。
您的第二个示例可以解释为此控件只绑定到ViewModel
并说“嘿,我知道子控件需要绑定到名为{{的ViewModel中的属性1}}。“,不能与其他SomePath