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
Barbara StreisandOriginal
2025-01-09 21:08:43284Durchsuche

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>

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:

an
<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:

  • 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!

Stellungnahme:
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