Ich habe meinen Kopf mit diesem Bindungsfehler auf meinen Schreibtisch geschlagen. Ich habe einige der Postings auf den BindingExpression
-Pfadfehler geprüft und kann nichts sehen, das mit meiner Situation funktioniert.
Jedenfalls habe ich ein benutzerdefiniertes Steuerelement namens IncrementingTextBox
. Ich versuche, es zu deaktivieren, wenn der Benutzer die CheckBox
darüber prüft.
Ich habe eine Bindung für die CheckBox
IsChecked
-Eigenschaft, die einwandfrei funktioniert und feuert, wenn sie beabsichtigt ist. Die UseSensorLength
-Eigenschaft wird im ConfigurationModel korrekt festgelegt.
Die Bindung der IncrementingTextBox
IsEnabled
-Eigenschaft verursacht jedoch einen BindingExpression
-Pfadfehler und wird daher nicht aktualisiert.
Als Test habe ich im Code versucht, das Steuerelement zu aktivieren und zu deaktivieren. Es funktioniert einwandfrei, aber ich kann die Bindung nicht dazu bringen, daran zu arbeiten.
Hier ist ein Ausschnitt aus meinem Xaml:
...
DataContext="{Binding RelativeSource={RelativeSource Self}}"
...
...
<CheckBox Content="Use Sensor Length" Margin="30,6,0,0"
IsChecked="{Binding ConfigurationModel.UseSensorLength, Mode=TwoWay}"/>
<local:IncrementingTextBox x:Name="video_length_textbox" Margin="0,0,0,5"
IsTextEnabled="False"
IsEnabled="{Binding ConfigurationModel.DontUseSensorLength}"
ValueChanged="VideoEventValueChanged"/>
Und hier ist ein Ausschnitt aus meinem ConfigurationModel:
public bool DontUseSensorLength
{
get { return !UseSensorLength; }
}
public bool UseSensorLength
{
get { return _useSensorLength; }
set
{
_useSensorLength = value;
OnPropertyChanged("UseSensorLength");
OnPropertyChanged("DontUseSensorLength");
}
}
Hier ist die Fehlermeldung, die ich beim Ausführen der App in meinem Ausgabefenster bekomme:
System.Windows.Data Fehler: 40: Fehler beim BindingExpression-Pfad: 'ConfigurationModel'-Eigenschaft wurde für' Objekt 'nicht gefunden '' IncrementingTextBox '(Name =' video_length_textbox ')' . BindingExpression: Path = ConfigurationModel.DontUseSensorLength; DataItem = 'IncrementingTextBox' (Name = 'video_length_textbox'); Ziel Element ist 'IncrementingTextBox' (Name = 'video_length_textbox'); Ziel Eigenschaft ist 'IsEnabled' (Typ 'Boolean')
Denken Sie daran, dass die Bindung der Eigenschaft 'UseSensorLength' einwandfrei funktioniert, die Bindung 'DontUseSensorLength' jedoch den obigen Fehler 'BindingExpression path' verursacht.
Ich habe kürzlich einige andere SO answer darüber geschrieben, wie man die Bindungsfehler liest, damit sie mehr Sinn machen. Fügen Sie Ihrer Fehlermeldung in Doppelpunkten und Semikolons Zeilenumbrüche hinzu, und lesen Sie sie von unten nach oben.
Ihre Fehlermeldung lautet:
Dies kann von unten nach oben gelesen werden als:
Die fehlerhafte Bindung ist die IsEnabled
-Eigenschaft eines Elements vom Typ IncrementingTextBox
(genannt video_length_textbox).
Die Variable DataItem
(DataContext
) des Elements ist ein Objekt vom Typ IncrementingTextBox
mit dem Namen video_length_textbox
Der zu suchende Bindungsausdruck lautet ConfigurationModel.DontUseSensorLength
Das Problem der Bindung besteht darin, dass die ConfigurationModel
-Eigenschaft nicht im Datenkontextobjekt IncrementingTextBox
gefunden wird.
Ihre DataContext
für "video_length_textbox" ist also auf sich selbst gesetzt und Ihre IncrementingTextBox
-Klasse hat keine öffentliche Eigenschaft namens ConfigurationModel
.
Da ich nicht sehe, dass Sie DataContext
für Ihre IncrementingTextBox
an einer beliebigen Stelle in Ihrer XAML festlegen, überprüfen Sie den Code für Ihre IncrementingTextBox
-Klasse. Der wahrscheinlichste Fall ist, dass Sie den DataContext im Konstruktor auf sich selbst setzen
this.DataContext = this;
oder die XAML
DataContext="{Binding RelativeSource={RelativeSource Self}}"
Ich hatte das gleiche Problem, weil die Objektklasse, aus der ich Daten herausgezogen hatte, nicht gefunden wurde. und gesetzt; auf seinen Eigenschaften.
das hat nicht funktioniert:
public string Name;
aber das hat funktioniert:
public string Name{ get; set; }
Nur wenige Dinge zu überprüfen
1.zuweisen Sie Werte in Eigenschaften vor InitializeComponent im Konstruktor
public partial class SampleClass: UserControl
{
public SampleClass()
{
ScenarioHeight = System.Windows.SystemParameters.WorkArea.Height - 350;
InitializeComponent();
}
public double ScenarioHeight { get;set;}
2.Wenn ein Benutzersteuerelement vorhanden ist, stellen Sie sicher, dass Sie userControl als Element in der Bindung hinzufügen
<ScrollViewer Name="sv" Height="{Binding Path=ScenarioHeight, ElementName=ucSampleClass}" >
Ich hatte das gleiche Problem und in meinem Fall verwendete ich bool
anstelle von Boolean
. Sobald ich es geändert habe, funktioniert es wie erwartet.
Dieser Fehler kann auch auftreten, wenn Sie zuvor versucht haben, eine nicht erreichbare oder nicht vorhandene Enumerable-Instanz mithilfe der XAML-Eigenschaft <ItemsSource>
zu binden.
Wenn Sie die Variable ItemsSource
mit dem korrekten Wert korrigieren, wird die Objektkollektion nicht automatisch durch XAML erneut initialisiert.
Als ich die UI-Listendarstellung ListBox
verwendete, sah ich dies in den Eigenschaften:
Das Löschen aller Elemente in der Sammlung und das Korrigieren des ItemSource
-Werts waren der Schlüssel.
Ich hatte eine ähnliche Erfahrung, die ItemsSource-Bindung auf einer Combobox funktionierte nicht.
In meinem Fall war es ein kleiner Fehler, der jedoch nur schwer nachverfolgbar ist, bis ich die Trace-Nachrichten aktiviert habe.
Ich vergesse einfach, meine Liste in eine Eigenschaft zu verwandeln :(
// NOPE:
public List<string> Versions;
// YEP:
public List<string> Versions { get; set; }
Vielleicht hilft das jemandem ...