2012-08-16 31 views
13

Próbuję powiązać kilka różnych właściwości w moim Xaml:Jak powiązać z RelativeSource Self?

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

Będziesz zauważył Użyłem dwóch różnych technik wiązania tutaj. Ci, którzy używają Nazwy Elementów, inni nie. Oto kod za:

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("")); 

Każda oprawa ma inną nazwę, ale w większości wygląda tak. Chcę moje Binding, aby móc pracować z:

{Binding Description} 

Zamiast:

{Binding Path=Description, ElementName=_UserInputOutput} 

wydaje się działać tylko gdy jest stosowany ElementName. Potrzebuję wyeksportować/zaimportować ten XAML, więc nie mogę mieć elementu ElementName lub import nie będzie działał.

myślałem, że to byłoby najlepsze:

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

To nie działa.

Jakieś pomysły? Dziękuję Ci!

+0

[Ten artykuł] (http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/30/debugging-data-bindings-in-a-wpf-or-silverlight-application.aspx) może być interesujące. –

Odpowiedz

26

Nie ustawiono DataContext, który jest używany przez RelativeSource do ustalenia, do czego jest względny. Musisz ustawić DataContext na wyższym poziomie, takim jak UserControl. Zazwyczaj mam:

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

To mówi UserControl, aby powiązać samą klasę w kodzie źródłowym.

+0

Jesteś niesamowita !!!!!! Woo hoo! To działa! –

+12

", którego używa RelativeSource do określenia, co jest względne" To stwierdzenie jest niepoprawne. Również ustawienie DataContext z UserControl rzadko jest dobrym pomysłem ... –

+2

Myślę, że to nie jest dobry pomysł, ponieważ narusza paradygmat MVVM: Kiedy chcemy używać WPF z MVVM mamy widok, który wiąże się z ViewModel. Tak więc wewnątrz konstruktora kodu z widoku mówimy 'View() {InitializeComponent(); DataContext = new ViewModel(); } ' Powoduje to, że wszystkie operacje powiązania danych działają na ViewModelu, dzięki czemu możemy oddzielić widok od ViewModel. – codingdave

29

{RelativeSource Self} cele obiektu, który jest właścicielem nieruchomości, który jest związany, jeśli masz takie wiązanie na Label to będzie wyglądać na Label.Description, którego nie ma. Zamiast tego powinieneś użyć {RelativeSource AncestorType=UserControl}.

Wiązania bez źródła (ElementName, Source, RelativeSource) są względem DataContext, jednak w UserControls zalecana avoid setting the DataContext nie bałagan z powiązaniami zewnętrznymi.