1. 程式人生 > >WPF Binding ElementName方式無效的解決方法--x:Reference綁定

WPF Binding ElementName方式無效的解決方法--x:Reference綁定

xaml mar element 相關 tips tooltip rac 可視化 中文

需求:

背景:Grid的有一個TextBlock name:T1和一個ListBox,ListBox中有兩個TextBlock name:T2,T3

要求:T2的前景色綁定到T1的前景色上(其他屬性同理)T3的前景色綁定到T2上

下面的代碼去掉了所有不必要的內容,僅保留了兩種綁定方式

<Path>
    <Path.ToolTip>
        <ToolTip>
            <StackPanel>
                <TextBlock Name="TipsTitle"/>
                <
ListBox> <ListBox.ItemTemplate> <DataTemplate> <StackPanel> <TextBlock Name="temp_series" Foreground="{Binding Source={x:Reference Name=TipsTitle}, Path=Foreground}
"/> <TextBlock Foreground="{Binding ElementName=temp_series,Path=Foreground}"/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </
ListBox> </StackPanel> </ToolTip> </Path.ToolTip> </Path>

x:Reference 是 XAML 2009 中引入的功能,也算是比較早的功能了;ElementName 是 XAML 一開始出現便開始有的功能。二者在使用時在感覺上是比較相似的,但多數情況下都更有優勢。

本文將解釋 x:Reference。

典型的使用 x:Reference 的例子是:

<object property="{x:Reference instancexName}" .../>
其中, instancexName 是另一個用 x:Name 指定名稱的元素。

x:Reference 前面帶了一個 x 命名空間前綴,所以可想而知這是與 x:Name 類似的 XAML 編譯相關的標記。

在微軟官方文檔中描述為:

In WPF and XAML 2006, element references are addressed by the framework-level feature of ElementName binding. For most WPF applications and scenarios, ElementName binding should still be used. Exceptions to this general guidance might include cases where there are data context or other scoping considerations that make data binding impractical and where markup compilation is not involved.
用中文來描述就是說:以前在 XAML 2006 的時候,使用 ElementName 在綁定中獲得對應到元素的綁定源,而這能適用於大多數情況。不過,如果綁定上下文中擁有不同的命名邊界,那麽這時使用 ElementName 可能無法找到綁定源。這時可以使用 x:Reference 替代。

你可以閱讀 WPF 的 ElementName 在 ContextMenu 中無法綁定成功?試試使用 x:Reference! - walterlv 了解 x:Reference 替代 ElementName 解決綁定中命名邊界的問題。

另外, ElementName 是在運行時通過查找可視化樹或邏輯樹來確定名稱邊界(NameScope)的,所以一定程度上性能也不那麽好。

https://www.codercto.com/a/31458.html

WPF Binding ElementName方式無效的解決方法--x:Reference綁定