webentwicklung-frage-antwort-db.com.de

WPF-Fehler 40 BindingExpression-Pfadfehler: Eigenschaft für 'Objekt' nicht gefunden

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 CheckBoxIsChecked-Eigenschaft, die einwandfrei funktioniert und feuert, wenn sie beabsichtigt ist. Die UseSensorLength -Eigenschaft wird im ConfigurationModel korrekt festgelegt.

Die Bindung der IncrementingTextBoxIsEnabled-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.

37
Curtis

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:

  • System.Windows.Data Fehler: 40:
    • BindingExpression path error: Die Eigenschaft 'ConfigurationModel' wurde in 'object' '' IncrementingTextBox '(Name =' video_length_textbox ')' nicht gefunden. 
    • BindingExpression: Path = ConfigurationModel.DontUseSensorLength; 
  • DataItem = 'IncrementingTextBox' (Name = 'video_length_textbox'); 
  • zielelement ist 'IncrementingTextBox' (Name = 'video_length_textbox'); 
  • zieleigenschaft ist 'IsEnabled' (Typ 'Boolean')

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}}"
94
Rachel

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; }
51
Janiiik

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}" >
1
Shahid

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.

1
BlackM

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:

 enter image description here

Das Löschen aller Elemente in der Sammlung und das Korrigieren des ItemSource-Werts waren der Schlüssel.

1
Max Bender

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

0
uceumern