Heim >Backend-Entwicklung >C++ >Warum funktioniert meine XAML-Bindung nicht mit einer Abhängigkeitseigenschaft, sondern mit CodeBehind?

Warum funktioniert meine XAML-Bindung nicht mit einer Abhängigkeitseigenschaft, sondern mit CodeBehind?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-09 21:11:45571Durchsuche

Why Doesn't My XAML Binding Work on a Dependency Property, But Works in Code-Behind?

XAML-Bindung schlägt bei Abhängigkeitseigenschaften fehl

Die Datenbindung für Abhängigkeitseigenschaften hat in XAML keine Auswirkung, funktioniert aber im CodeBehind einwandfrei. Der folgende Codeausschnitt veranschaulicht das Problem:

<code class="language-xml"><UserControl ...="" x:Class="WpfTest.MyControl">
    <TextBlock Text="{Binding Test}"/>
</UserControl></code>

Abhängigkeitseigenschaften werden wie folgt definiert:

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

Im Hauptfenster funktioniert die Bindung an normale Eigenschaften einwandfrei:

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

Die gleiche Bindung im Benutzersteuerelement aktualisiert jedoch nicht den Text:

<code class="language-xml"><MyControl Test="{Binding MyText}" x:Name="TheControl"/></code>

Es ist erwähnenswert, dass die Bindung gut funktioniert, wenn sie im Code-Behind implementiert wird:

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

Lösung:

Korrekte Deklaration der Abhängigkeitseigenschaft:

<code class="language-csharp">public static readonly DependencyProperty TestProperty =
    DependencyProperty.Register(
        nameof(Test),
        typeof(string),
        typeof(MyControl),
        new PropertyMetadata("DEFAULT"));</code>

Bindung in UserControl XAML:

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

Vermeiden Sie das Festlegen von DataContext im UserControl-Konstruktor:

Legen Sie niemals den DataContext im Konstruktor des UserControl fest. Dadurch wird verhindert, dass das UserControl den DataContext seines übergeordneten Elements erbt.

Das obige ist der detaillierte Inhalt vonWarum funktioniert meine XAML-Bindung nicht mit einer Abhängigkeitseigenschaft, sondern mit CodeBehind?. 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