2012-08-16 77 views
13

我想在我的XAML中綁定幾個不同的屬性:如何綁定到RelativeSource Self?

<Label Content="{Binding Description}" 
Visibility="{Binding Path=DescriptionVisibility, 
ElementName=_UserInputOutput}"    
FontSize="{Binding Path=FontSizeValue, ElementName=_UserInputOutput}" 
HorizontalAlignment="Left" VerticalAlignment="Top" Padding="0" /> 

你會發現我在這裏用了兩個不同的結合技術。使用元素名稱的工作,另一個不工作。這裏是後面的代碼:

public string Description 
{ 
    get { return (string)GetValue(DescriptionProperty); } 
    set { SetValue(DescriptionProperty, value); } 
} 
public static readonly DependencyProperty DescriptionProperty = 
DependencyProperty.Register("Description", typeof(string), typeof(UserControl), 
new UIPropertyMetadata("")); 

每個綁定具有不同的名稱,但它們大部分都是這樣的。 我希望我的綁定能夠與合作:

{Binding Description} 

相反的:

{Binding Path=Description, ElementName=_UserInputOutput} 

似乎只用於的ElementName時要工作。我需要導出/導入這個XAML,所以我不能有一個ElementName或導入不起作用。

我想這將是最好的:

{Binding Path=Description, RelativeSource={RelativeSource Self}} 

這沒有奏效。

任何想法??謝謝!

+0

[本文](http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/30/debugging-data-bindings-in-a-wpf-or-silverlight-application.aspx)可能會感興趣。 – 2012-08-16 23:01:50

回答

26

您還沒有設置DataContext,這是RelativeSource用來確定它相對於什麼的。您需要在更高級別設置DataContext,如UserControl。我通常有:

<UserControl ... DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
</UserControl> 

這告訴UserControl在代碼隱藏中綁定自己的類。

+0

你真了不起!!!!!!嗚呼!有用! – 2012-08-16 21:32:12

+12

「這是什麼RelativeSource是用來確定它相對於」該聲明是明顯不正確的。同時設置UserControl的DataContext也不是一個好主意...... – 2012-08-16 22:52:40

+2

我認爲這不是一個好主意,因爲它違反了MVVM範例:當我們想使用WPF和MVVM時,我們有一個視圖綁定到它的ViewModel。因此,在View的構造函數後面,我們說'View(){InitializeComponent(); DataContext = new ViewModel(); }' 這使得所有的數據綁定操作都可以在ViewModel上工作,所以我們可以將視圖從ViewModel中分離出來。 – codingdave 2016-09-15 11:57:33

29

{RelativeSource Self}針對擁有被綁定屬性的對象,如果您在Label上有這樣的綁定,它將查找Label.Description,但不存在。相反,你應該使用{RelativeSource AncestorType=UserControl}

沒有綁定源(ElementNameSourceRelativeSource)在UserControls不過是相對於DataContext,你應該avoid setting the DataContext不與外部綁定一塌糊塗。

相關問題