Heim > Backend-Entwicklung > C++ > Warum funktioniert meine XAML-Bindung nicht für eine Abhängigkeitseigenschaft in einem WPF-Benutzersteuerelement?

Warum funktioniert meine XAML-Bindung nicht für eine Abhängigkeitseigenschaft in einem WPF-Benutzersteuerelement?

Barbara Streisand
Freigeben: 2025-01-09 21:08:43
Original
270 Leute haben es durchsucht

Why Doesn't My XAML Binding Work on a Dependency Property in a WPF User Control?

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

MainWindow ViewModel (oder DataContext):

<code class="language-csharp">private string _myText = "default";
public string MyText
{
    get { return _myText; }
    set { _myText = value; NotifyPropertyChanged(); }
}</code>
Nach dem Login kopieren

Bindung im MainWindow (Erfolgreich):

<code class="language-xml"><TextBlock Text="{Binding MyText}" /></code>
Nach dem Login kopieren

Bindung in der Benutzersteuerung (fehlschlägt):

<code class="language-xml"><MyControl Test="{Binding MyText}" /></code>
Nach dem Login kopieren

Code-Behind-Bindung (erfolgreich):

<code class="language-csharp">TheControl.SetBinding(MyControl.TestProperty, new Binding
{
    Source = DataContext,
    Path = new PropertyPath("MyText"),
    Mode = BindingMode.TwoWay
});</code>
Nach dem Login kopieren

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:

an
<code class="language-xml"><UserControl ... x:Class="WpfTest.MyControl">
    <TextBlock Text="{Binding Test, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" />
</UserControl></code>
Nach dem Login kopieren

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:

  • Vermeiden Sie DataContext im Konstruktor des Benutzersteuerelements: Das Festlegen von DataContext im Konstruktor des Benutzersteuerelements wird im Allgemeinen nicht empfohlen und kann zu Bindungsproblemen führen.
  • Explizite Code-Behind-Bindung: Für eine robuste Bindung sollten Sie erwägen, Bindungen explizit im Code-Behind festzulegen, wie oben gezeigt. Dies sorgt für mehr Kontrolle und Klarheit.

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage