2013-10-08 59 views
41

按照x:Reference Markup Extension頁面上MSDN,x:Referencex:Reference和ElementName有什麼區別?

引用在XAML標記別處聲明的實例。該引用引用元素的x:Name。

按照Binding.ElementName Property頁面上MSDN,ElementName

Name屬性或x的值:感興趣的元素的名稱指令。

X:在第一頁上的備註部分

回首參考和WPF

在WPF和2006年XAML,元素引用由框架級功能解決ElementName綁定。對於大多數WPF應用程序和場景,仍應使用ElementName綁定。此一般性指南的例外情況可能包括數據上下文或其他範圍注意事項使數據綁定不切實際以及不涉及標記編譯的情況。

爲了完整起見,這裏是ElementName頁面上的言論段的一部分:當你要綁定到另一個元素的應用程序中的財產

此屬性很有用。例如,如果要使用Slider控制應用程序中另一個控件的高度,或者要將控件的內容綁定到ListBox控件的SelectedValue屬性。

現在,當我完全知道何時以及如何使用ElementName財產,我不完全理解和x:Reference標記擴展之間的區別。任何人都可以請解釋這一點,特別是擴大從x:Reference備註欄?:

例外情況一般引導的最後一句話可能包括在有數據的上下文或其他作用域的考慮,使數據綁定不切實際的情況下,並且不涉及標記編譯。

回答

48

基本上就像你說的那樣,兩者幾乎一樣。然而,在引擎蓋上有一些小的差異。

{x:Reference ...} - >只返回一個對象的引用,它不會創建像綁定這樣的兩個屬性之間的「橋接」。在所有正在使用的服務之後,在通常是窗口本身的特定範圍內搜索給定的名稱。

{Binding ElementName="..." } - >首先它創建該綁定對象,然後它搜索對象名稱,但不使用與x:Reference相同的技巧。搜索算法在VisualTree中向上和/或向下移動以找到所需的元素。因此總是需要一個功能性的VisualTree。作爲在Non-UiElement中使用的示例,它不起作用。最後,綁定停留並且做它的每日麪包。

這是行不通的:

<StackPanel> 
<Button x:name="bttn1" Visibility="Hidden">Click me</Button> 
<DataGrid> 
    <DataGrid.Columns> 
    <DataGridTextColumn Visibility="{Binding ElementName=bttn1, Path=DataContext.Visibility}"/> 
.... 

這工作:

<StackPanel> 
<Button x:name="bttn1" Visibility="Hidden">Click me</Button> 
<DataGrid> 
    <DataGrid.Columns> 
    <DataGridTextColumn Visibility="{Binding Source={x:Reference bttn1}, Path=DataContext.Visibility}"/> 
.... 

有點像那:)

+1

所以主要區別在於控件是否是UIElement? – Sheridan

+10

+1。順便說一句,你有這個信息的來源,還是僅僅來自於經驗? 這裏沒有提到的一件事是,孩子不能'x:引用'它的父母(這種關係似乎取決於上下文,而不是在視覺樹上),因爲這會導致循環引用問題。由於其他一些神祕的問題,有時參考文獻也會默默無聞地解決。 – GregRos

+0

該信息的來源是源代碼本身:) –

0

elementName爲特定的平臺。即它可能會或可能不會基於您使用的平臺而存在。 x:引用將該概念提升爲XAML本機特性。因此任何支持XAML的平臺都支持x:Reference。