Hallo liebe Forenten
Heute habe ich ein Problem, bei dem ich nicht weiterkomme. Folgende Situation:
Ich habe ein UserControl mit einem DependencyProperty im CodeBehind:
<UserControl
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<TextBox Text="{Binding WatermarkText}" />
</UserControl>
public static readonly DependencyProperty WatermarkTextProperty = DependencyProperty.Register(nameof(WatermarkText), typeof(string), typeof(ValueSpinner), new PropertyMetadata("dp_default"));
public string WatermarkText
{
get => (string)GetValue(WatermarkTextProperty);
set => SetValue(WatermarkTextProperty, value);
}
Im MainWindow ist im CodeBehind ein Property:
private string _testText = "MainWindow_CodeBehind";
public string TestText
{
get => _testText;
set => SetField(ref _testText, value);
}
Das binde ich nun auf das DependencyProperty vom UserControl:
<Window
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<StackPanel>
<TextBox Margin="10" Text="{Binding TestText}" />
<local:ValueSpinner Margin="10" WatermarkText="MainWindow_Xaml" />
<local:ValueSpinner Margin="10" WatermarkText="{Binding TestText}" />
<local:ValueSpinner Margin="10" WatermarkText="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}, Path=TestText}" />
</StackPanel>
</Window>
Ergebnis sieht so aus:
Man kann sehen, dass bei der Zeile
<local:ValueSpinner Margin="10" WatermarkText="{Binding TestText}" />
das Binding nicht greift und ich verstehe nicht warum.
Edit: Setter und Callback vom DependencyProperty werden hier übrigens nicht aufgerufen.
Kann mir jemand erklären, warum das nicht tut, wie ich das will?
Viele Grüße
Alf
PS:
Das hier tut interessanterweise:
<local:ValueSpinner Margin="10" WatermarkText="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}, Path=TestText}" />
Auf diese Idee kam ich dank Binding an einen DataContext von einem DataGrid das an eine ItemsSource gebunden ist
Edit2:
Ich verstehe jetzt, warum das Property nicht gebunden wird. Ich setze den DataContext vom ValueSpinner. Der DataContext von der Instanz von ValueSpinner wird deswegen anscheinend nicht geerbt.
Jetzt muss ich nur noch überlegen, wie ich dann mein ValueSpinner-View auf mein CodeBehind (oder ViewModel) binden kann.
Edit3:
Das ist tatsächlich die Lösung. DataContext vom UserControl nicht setzen und dafür beim bindenden Control direkt.
<UserControl>
<TextBox Text="{Binding WatermarkText}" DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:ValueSpinner}}}" />
</UserControl>
Ich danke euch für eure Aufmerksamkeit. Für ergänzenden Anmerkungen bin ich dankbar.
Viele Grüße
Alf