绑定元素名称如何正常工作?

时间:2013-08-22 19:20:31

标签: c# wpf xaml binding

我记得几周前读过它有时在模板中不起作用,我最近试图在两个不同的窗口中绑定东西而且找不到名称声明,所以我认为它是本地的该类的命名空间,只是通过设置datacontext来绑定。但是,当我能够使用绑定元素名称时,我真的很好奇,当我不能使用时,因为它在可能的情况下更方便。

编辑:在阅读那篇文章时,我发现这很有趣:

“因此,样式和模板都定义了自己的XAML名称范围,与应用样式或模板的对象树中的任何位置无关。”

如果这是真的,那是不是意味着Binding ElementName根本不适用于模板?但是我的模板中的ElementName肯定有一些工作绑定。这是最令人困惑的部分,为什么一些绑定在模板中随机工作而其他绑定没有?它必须有一些尝试解析名称的方法,即使它不在模板或同一个名称范围内

1 个答案:

答案 0 :(得分:14)

基本上你需要处于相同的name scope(阅读本文)。大多数UI元素在同一个树中共享相同的名称范围,但是可能存在中断和障碍(样式/模板),如果您有像DataGrid列这样的抽象对象,则它们根本没有名称范围。 / p>

我已经和WPF一起工作了足够长的时间来猜测我什么时候会遇到问题并且我知道常见的区域,但是并不认为在所有情况下都能提前告诉你。


  

如果这是真的,那是不是意味着Binding ElementName根本不适用于模板?但是我的模板中的ElementName肯定有一些工作绑定。

内部就好了,这是相同的范围。这里的要点是,如果您应用模板并且它们没有自己的范围,则会发生冲突。

e.g。

<Button/>
<Button/>

如果我们扩展ControlTemplate,你会得到类似的结果:

<Border Name="bd" Background="{TemplateBinding Background}">...</Border>
<Border Name="bd" Background="{TemplateBinding Background}">...</Border>

显然我们会发生名称冲突。

DataTemplates中的ItemsControls相同,如果您在模板中命名控件名称将与其他项目的应用模板中的同一控件实例冲突。


另一方面,您可以从模板内部绑定到外部,因为逻辑上只有一个具有该名称的实例,或者您可以根据名称范围的“关闭”方式为它们提供不同的优先级,例如

<TextBox Name="tb" Text="Test"/>
<ItemsControl ItemsSource="ABC">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Text, ElementName=tb}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>