WPF-Benutzersteuerung: XAML-Bindungsprobleme mit Abhängigkeitseigenschaften
Die Bindung an eine Abhängigkeitseigenschaft innerhalb des XAML eines WPF-Benutzersteuerelements kann schwierig sein. Sehen wir uns ein häufiges Szenario an:
Benutzersteuerung mit TextBlock:
<code class="language-xml"><UserControl ... x:Class="WpfTest.MyControl"> <TextBlock Text="{Binding Test}" /> </UserControl></code>
Abhängigkeitseigenschaft in der Benutzersteuerung:
<code class="language-csharp">public static readonly DependencyProperty TestProperty = DependencyProperty.Register( "Test", typeof(string), typeof(MyControl), new PropertyMetadata("DEFAULT")); public string Test { get { return (string)GetValue(TestProperty); } set { SetValue(TestProperty, value); } }</code>
MainWindow ViewModel (oder DataContext):
<code class="language-csharp">private string _myText = "default"; public string MyText { get { return _myText; } set { _myText = value; NotifyPropertyChanged(); } }</code>
Bindung im MainWindow (Erfolgreich):
<code class="language-xml"><TextBlock Text="{Binding MyText}" /></code>
Bindung in der Benutzersteuerung (fehlschlägt):
<code class="language-xml"><MyControl Test="{Binding MyText}" /></code>
Code-Behind-Bindung (erfolgreich):
<code class="language-csharp">TheControl.SetBinding(MyControl.TestProperty, new Binding { Source = DataContext, Path = new PropertyPath("MyText"), Mode = BindingMode.TwoWay });</code>
Grundursache:
Die XAML-Bindung innerhalb des Benutzersteuerelements schlägt fehl, da die Bindungsquelle nicht explizit definiert ist. Standardmäßig werden die eigenen Eigenschaften des Benutzersteuerelements verwendet.
Lösung:
Geben Sie die Bindungsquelle mit RelativeSource
:
<code class="language-xml"><UserControl ... x:Class="WpfTest.MyControl"> <TextBlock Text="{Binding Test, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" /> </UserControl></code>
Dadurch wird die Bindung explizit angewiesen, den Vorfahren des Typs UserControl
für die Eigenschaft Test
zu suchen. Alternativ können Sie AncestorType={x:Type Window}
verwenden, wenn sich der Datenkontext auf Fensterebene befindet.
Wichtige Überlegungen:
DataContext
im Konstruktor des Benutzersteuerelements wird im Allgemeinen nicht empfohlen und kann zu Bindungsproblemen führen.Indem Sie diese Richtlinien befolgen, können Sie in Ihren WPF-Benutzersteuerelementen zuverlässig eine Bindung an Abhängigkeitseigenschaften herstellen.
Das obige ist der detaillierte Inhalt vonWarum funktioniert meine XAML-Bindung nicht für eine Abhängigkeitseigenschaft in einem WPF-Benutzersteuerelement?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!