2016-11-01 3 views
0

Ich habe ein seltsames Problem mit DependecyProperty-Bindung. Um die Frage einfacher Ive zu halten einige Dummy-Steuerelement erstellt, welche die gleiche unerwünschte Verhalten hatWPF Bindung an UserControl DependencyProperty funktioniert nicht wie erwartet

Ich habe eine Usercontrol, die eine DependencyProperty in Code hinter definiert hat:

public static readonly DependencyProperty TestValueProperty = DependencyProperty.Register("TestValue", typeof(string), typeof(Test), new PropertyMetadata(default(string))); 

public string TestValue 
{  
    get { return (string)GetValue(TestValueProperty); } 
    set { SetValue(TestValueProperty, value); } 
} 

Diese Eigenschaft verwendet wird, in XAML:

<Label Content="{Binding TestValue}" /> 

diese Kontrolle soll in einer anderen Steuerung wie folgt verwendet werden:

<views:Test TestValue="{Binding Settings.Setting123}" /> 

Settings ist in Viewmodel als Eigenschaft definiert.

Aber der Inhalt von Settings.Setting123 ist nicht sichtbar in meinem Benutzerkontrollschild.

Wenn einige Fixes Wert Schreiben statt dem es verbindlich funktioniert:

<views:Test TestValue="Test" /> 

Aber natürlich ich nicht einen festen Wert will, aber der Inhalt des gebundenen Objekts. Irgendein Hinweis, was hier schief läuft?

Vielen Dank im Voraus!

+0

Geben Sie bitte genügend Code ein, um das Problem zu reproduzieren. –

+1

Obwohl Sie es in Ihrer Frage nicht gezeigt haben, stellen Sie den DataContext des UserControl sicher auf sich selbst (z.von 'DataContext = this' in seinem Konstruktor). Entfernen Sie das und schreiben Sie die Bindungen in das XAML des UserControls mit einer RelativeSource, wie in Eds Antwort gezeigt. – Clemens

+0

Ja, DataContext in UserControl ist wie folgt: DataContext = "{Binding RelativeSource = {RelativerSource Mode = Self}}" – emvoll

Antwort

0

Sie haben nicht genug Code für jedermann, um das Problem neu zu erstellen, aber lesen zwischen den Zeilen, ich vermute, dass Label in Ihrem UserControl XAML ist. Wenn TestValue eine Eigenschaft Ihrer UserControl ist, wird dies wahrscheinlich funktionieren:

<Label Content="{Binding TestValue, RelativeSource={RelativeSource AncestorType=UserControl}}" /> 

jedoch ein Grund, vielleicht haben Sie getan, dass (und hatte es halb-Arbeit, mit Literalzeichenfolgen) ist, wenn Sie Ihre UserControl seinen eigenen gemacht DataContext. In diesem Fall dann ist das Problem, dass Sie Ihre UserControl eigene DataContext gemacht haben. Wenn Sie das getan haben, wird Binding auf dem gebundenen im Zusammenhang mit der UserControl ausgewertet, die keine Settings.Setting123 Eigenschaft hat.

Was für eine DataContext Mittel der Kontrolle, ist, dass, wenn Sie ein Binding auf eines der Steuerelemente Eigenschaften oder in seinem XAML haben, das ist, wo die Binding für die Eigenschaft, die Sie binden suchen geht. Sie sagen es ausdrücklich, an der falschen Stelle zu suchen. Wenn Sie Ihre UserControl ihre eigene DataContext machen, können Sie nichts daran binden. Deshalb solltest du das nicht tun. Es ist wie eine dieser Maschinen, die sich nur von der Wand lösen. Verwenden Sie stattdessen {RelativeSource AncestorType=UserControl} Bindungen wie oben im UserControl XAML.

Ich sollte nicht raten müssen. Sie behaupten, Sie hätten ein minimales nachprüfbares Beispiel erstellt, hätten es aber nicht geteilt. Wenn Sie es teilen, können wir Ihr Problem mit Zuversicht lösen.

+0

Ja, das hat ziemlich gut funktioniert. Danke fürs Helfen! – emvoll

Verwandte Themen