2012-08-16 16 views
13

Ich versuche, verschiedene Eigenschaften in meiner XAML zu binden:Wie binde ich an RelativeSource Self?

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

Sie bemerkte ich hier zwei verschiedene Bindungstechniken verwendet haben. Diejenigen, die Element Name verwenden, arbeiten, die andere nicht. Hier ist der Code hinten:

Jede Bindung hat einen anderen Namen, aber sie sehen alle größtenteils so aus. Ich möchte meine Bindung der Lage sein, mit zu arbeiten:

{Binding Description} 

Statt:

{Binding Path=Description, ElementName=_UserInputOutput} 

Es scheint nur zu funktionieren, wenn Elementname verwendet wird. Ich muss dieses XAML exportieren/importieren, also kann ich keinen ElementName haben oder der Import wird nicht funktionieren.

dachte ich, das Beste wäre:

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

arbeiten Dies geschah nicht.

Irgendwelche Ideen ?? Vielen Dank!

+0

[Dieser Artikel] (http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/30/debugging-data-bindings-in-a-wpf-or-silverlight-application.aspx) könnte von Interesse sein. –

Antwort

26

Sie haben den DataContext nicht festgelegt. Dies ist der Zweck der RelativeSource, um zu bestimmen, was damit gemeint ist. Sie müssen den DataContext auf einer höheren Ebene wie dem UserControl festlegen. Ich habe typischerweise:

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

Dies teilt das UserControl, um sich die Klasse im Codebehind zu binden.

+0

Sie sind erstaunlich !!!!!! Woo hoo! Es klappt! –

+12

"Welches ist die RelativeSource, um zu bestimmen, was es bedeutet?" Diese Aussage ist einfach falsch. Auch das Setzen des DataContext eines UserControl ist selten eine gute Idee ... –

+2

Ich denke, das ist keine gute Idee, da es das MVVM-Paradigma verletzt: Wenn wir WPF mit MVVM verwenden wollen, haben wir eine View, die an ihr ViewModel bindet. Also sagen wir im Konstruktor des hinter der View liegenden Codes 'View() {InitializeComponent(); DataContext = neues ViewModel(); } ' Dadurch werden alle Datenbindungsoperationen auf dem ViewModel ausgeführt, sodass wir die Ansicht vom ViewModel trennen können. – codingdave

29

{RelativeSource Self} zielt auf das Objekt, das die Eigenschaft besitzt, die gebunden wird, wenn Sie eine solche Bindung auf eine Label haben, wird es nach Label.Description suchen, die nicht da ist. Stattdessen sollten Sie {RelativeSource AncestorType=UserControl} verwenden.

Bindungen ohne eine Quelle sind (ElementName, Source, RelativeSource) an die DataContext relativ, aber in UserControls sollten Sie avoid setting the DataContext mit externen Bindungen nicht verwirren.

Verwandte Themen