Heim >Backend-Entwicklung >C++ >Warum schlägt meine XAML-Bindung an eine Abhängigkeitseigenschaft fehl, aber Code-Behind funktioniert?

Warum schlägt meine XAML-Bindung an eine Abhängigkeitseigenschaft fehl, aber Code-Behind funktioniert?

DDD
DDDOriginal
2025-01-09 20:52:43585Durchsuche

Why Is My XAML Binding to a Dependency Property Failing, But Code-Behind Works?

XAML-Bindungsabhängigkeitseigenschaften fehlgeschlagen

Frage

Das Binden von Abhängigkeitseigenschaften schlägt in XAML fehl, funktioniert aber im CodeBehind einwandfrei.

Grund

  1. Fehler bei der Deklaration der Abhängigkeitseigenschaft: TestProperty Der Deklaration der Abhängigkeitseigenschaft fehlt der Operator nameof(), was zu einer Nichtübereinstimmung zwischen dem Eigenschaftsnamen und dem XAML-Bindungspfad führt.
  2. Bindungsquellenfehler in
  3. DataContext im Konstruktor festlegen: Durch das Festlegen der DataContext-Eigenschaft im Konstruktor von UserControl wird die Vererbung des DataContext des übergeordneten Elements verhindert, wodurch die Bindungsquelle ungültig wird.
Lösung

1. Abhängigkeitsattribute korrekt deklarieren

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

2. Legen Sie Bindings.RelativeSource in XAML fest

<code class="language-xml"><TextBlock Text="{Binding Test,
    RelativeSource={RelativeSource AncestorType=UserControl}}"></TextBlock></code>

3. Löschen Sie die DataContext-Zuweisung im Konstruktor

Entfernen Sie die Codezeile

aus dem UserControl-Konstruktor. DataContext = this;

Zusätzliche Hinweise

Legen Sie die Bindungsquelle explizit im CodeBehind fest:

<code class="language-csharp">TheControl.SetBinding(MyControl.TestProperty, new Binding
{
    Source = DataContext,
    ...
});</code>
Bindungsquelle implizit in XAML festlegen:

<code class="language-xml"><MyControl Test="{Binding MyText}"></MyControl></code>
In XAML ist die implizite Bindungsquelle standardmäßig der aktuelle DataContext und sollte vom übergeordneten Fenster korrekt festgelegt werden. Durch das Festlegen des DataContext im Konstruktor von UserControl wird der geerbte DataContext überschrieben, was dazu führt, dass die Bindung fehlschlägt. Durch das Festlegen von

in der Code-Behind-Bindung wird die Bindungsquelle explizit auf den geerbten DataContext festgelegt, wodurch sichergestellt wird, dass die Bindung gültig ist. Source = DataContext

Das obige ist der detaillierte Inhalt vonWarum schlägt meine XAML-Bindung an eine Abhängigkeitseigenschaft fehl, aber Code-Behind funktioniert?. 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