13

我记得几周前读到它有时在模板中不起作用,我最近尝试在两个不同的窗口中绑定东西,但它找不到名称声明,所以我假设它是本地的命名空间类,只是通过设置数据上下文来绑定。但是,我真的很好奇我什么时候可以使用绑定元素名,什么时候不能,因为如果可以的话,它会方便得多。

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

“出于这个原因,样式和模板都定义了自己的 XAML 名称范围,独立于对象树中应用样式或模板的任何位置。”

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

4

1 回答 1

17

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

我一直在使用 WPF 足够长的时间来猜测我什么时候会遇到问题,并且我知道公共区域,但不认为有一种简单的方法可以预先判断所有情况。


如果这是真的,那是否意味着 Binding ElementName 根本不应该在模板中工作?但是,我的模板中肯定有一些对 ElementName 的有效绑定。

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

例如

<Button/>
<Button/>

如果我们扩展ControlTemplate你会得到类似的东西:

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

显然我们会遇到名称冲突。

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


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

<TextBox Name="tb" Text="Test"/>
<ItemsControl ItemsSource="ABC">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Text, ElementName=tb}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
于 2013-08-22T19:26:07.103 回答