我记得几周前阅读它有时在模板中不起作用,我最近试图在两个不同的窗口中绑定东西,但是找不到名称声明,所以我认为它是名称空间的本地名称通过设置datacontext来绑定类.但是,当我能够使用绑定元素名称时,我真的很好奇,当我不能使用时,因为它可能会更方便.
编辑:在阅读那篇文章时,我发现这很有趣:
“因此,样式和模板都定义了自己的XAML名称范围,与应用样式或模板的对象树中的任何位置无关.”
如果这是真的,那是不是意味着Binding ElementName根本不适用于模板?但是我的模板中的ElementName肯定有一些工作绑定.这是最令人困惑的部分,为什么一些绑定在模板中随机工作而其他绑定没有?它必须有一些尝试解析名称的方法,即使它不在模板或同一个名称范围内
解决方法
基本上你需要在同一个
name scope(阅读本文).大多数UI元素都在同一个树中,共享相同的名称范围,但是可能存在中断和障碍(样式/模板),如果您有像DataGrid列这样的抽象对象,则它们根本没有名称范围.
我已经和WPF一起工作了足够长的时间来猜测我什么时候会遇到问题并且我知道常见的区域,但是不要认为在所有情况下都可以轻松地告诉我.
if this is true,doesn’t that mean that Binding ElementName should not work in templates at all? But then I definitely have some working bindings on ElementName within my templates.
内部就好了,这是相同的范围.这里的要点是,如果您应用模板并且它们没有自己的范围,则会发生冲突.
例如
<Button/> <Button/>
如果我们扩展ControlTemplate你会得到类似的东西:
<Border Name="bd" Background="{TemplateBinding Background}">...</Border> <Border Name="bd" Background="{TemplateBinding Background}">...</Border>
显然我们会得到名称冲突.
如果您在模板中命名控件名称将与其他项目的应用模板中的同一控件实例冲突,则对于ItemsControls中的DataTemplates也是如此.
另一方面,您可以从模板内部绑定到外部,因为逻辑上只有一个具有该名称的实例,或者您可以根据名称范围的“关闭”方式为它们提供不同的优先级,例如:
<TextBox Name="tb" Text="Test"/> <ItemsControl ItemsSource="ABC"> <ItemsControl.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding Text,ElementName=tb}"/> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl>