簡體   English   中英

綁定元素名稱如何正常工作?

[英]How does binding elementname work exactly?

我記得幾周前閱讀它有時在模板中不起作用,我最近試圖在兩個不同的窗口中綁定東西,但是找不到名稱聲明,所以我認為它是名稱空間的本地名稱通過設置datacontext來綁定類。 但是,當我能夠使用綁定元素名稱時,我真的很好奇,當我不能使用時,因為它可能會更方便。

編輯:在閱讀那篇文章時,我發現這很有趣:

“因此,樣式和模板都定義了自己的XAML名稱范圍,與應用樣式或模板的對象樹中的任何位置無關。”

如果這是真的,那是不是意味着Binding ElementName根本不適用於模板? 但是我的模板中的ElementName肯定有一些工作綁定。 這是最令人困惑的部分,為什么一些綁定在模板中隨機工作而其他綁定沒有? 它必須有一些嘗試解析名稱的方法,即使它不在模板或同一個名稱范圍內

基本上你需要在同一個名稱范圍內 (閱讀本文)。 大多數UI元素都在同一個樹中,共享相同的名稱范圍,但是可能存在中斷和障礙(樣式/模板),如果您有像DataGrid列這樣的抽象對象,則它們根本沒有名稱范圍。

我已經和WPF一起工作了足夠長的時間來猜測我什么時候會遇到問題並且我知道常見的區域,但是不要認為在所有情況下都可以輕松地告訴我。


如果這是真的,那是不是意味着Binding ElementName根本不適用於模板? 但是我的模板中的ElementName肯定有一些工作綁定。

內部就好了,這是相同的范圍。 這里的要點是,如果您應用模板並且它們沒有自己的范圍,則會發生沖突。

例如

<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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM