Fehlerbehebung bei WPF-XAML-Bindungsproblemen mit Abhängigkeitseigenschaften
Dieser Artikel befasst sich mit einem häufigen WPF-Problem: Die XAML-Datenbindung aktualisiert die Benutzeroberfläche nicht, wenn sich eine Abhängigkeitseigenschaft ändert, obwohl die CodeBehind-Bindung ordnungsgemäß funktioniert.
Szenario:
Eine WPF-Anwendung verwendet eine Abhängigkeitseigenschaft in XAML, aber die Bindung aktualisiert die Benutzeroberfläche nicht, wenn sich der Wert der gebundenen Eigenschaft ändert. Die Code-Behind-Bindung funktioniert jedoch wie erwartet.
Definition der Abhängigkeitseigenschaft (falsch):
<code class="language-csharp">public static readonly DependencyProperty TestProperty = DependencyProperty.Register("Test", typeof(string), typeof(MyControl), new PropertyMetadata("DEFAULT"));</code>
XAML-Bindung (Problem):
<code class="language-xaml"><TextBlock Text="{Binding Test}"></TextBlock></code>
Die Lösung:
Das Kernproblem liegt in der Registrierung der Abhängigkeitseigenschaft und der XAML-Bindung. Hier ist der korrigierte Ansatz:
Korrigierte Definition der Abhängigkeitseigenschaft:
<code class="language-csharp">public static readonly DependencyProperty TestProperty = DependencyProperty.Register( nameof(Test), // Use nameof for better maintainability typeof(string), typeof(MyControl), new PropertyMetadata("DEFAULT"));</code>
Korrigierte XAML-Bindung:
<code class="language-xaml"><TextBlock Text="{Binding Test, RelativeSource={RelativeSource AncestorType=UserControl}}"></TextBlock></code>
Dieses korrigierte XAML legt RelativeSource
explizit fest, um UserControl
als Bindungsquelle zu finden.
Wichtige Überlegungen:
Vermeiden Sie das Festlegen von DataContext im UserControl-Konstruktor: Das Festlegen von DataContext
im Konstruktor eines UserControl
verhindert die Vererbung des DataContext
des übergeordneten Elements, was häufig zu Bindungsfehlern führt.
Alternative: Explizite Bindung in Code-Behind: Wenn die Verwendung von RelativeSource
nicht praktikabel ist, legen Sie die Bindung explizit in Code-Behind fest:
<code class="language-csharp">TheControl.SetBinding(MyControl.TestProperty, new Binding { Source = DataContext, // Use the MainWindow's DataContext Path = new PropertyPath("MyText"), Mode = BindingMode.TwoWay });</code>
Indem Sie diese Schritte befolgen, können Sie sicherstellen, dass Ihre XAML-Bindungen Ihre Abhängigkeitseigenschaften korrekt aktualisieren, was zu einer funktionsfähigen und reaktionsfähigen WPF-Anwendung führt.
Das obige ist der detaillierte Inhalt vonWarum aktualisiert meine XAML-Bindung meine Abhängigkeitseigenschaft nicht?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!