web-dev-qa-db-fra.com

Erreur 40 de WPF Erreur de chemin BindingExpression: propriété non trouvée sur 'objet'

Je me tape la tête sur mon bureau avec cette erreur de reliure. J'ai vérifié plusieurs des écritures pour l'erreur de chemin BindingExpression et je ne vois rien qui fonctionne dans ma situation.

Quoi qu'il en soit, j'ai un contrôle personnalisé appelé IncrementingTextBox. J'essaie de le désactiver chaque fois que l'utilisateur "vérifie" la CheckBox ci-dessus.

J'ai une liaison sur la propriété CheckBoxIsChecked qui fonctionne bien et qui se déclenche lorsqu'elle est censée le faire. Il définit correctement la propriété UseSensorLength sur le ConfigurationModel.

Cependant, la liaison sur la propriété IncrementingTextBoxIsEnabled provoque une erreur de chemin BindingExpression et ne se met donc pas à jour du tout.

En guise de test, j’ai essayé d’activer et de désactiver le contrôle dans le code précédent et cela fonctionne très bien, mais je n'arrive pas à faire en sorte que la liaison fonctionne.

Voici un extrait de mon 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"/>

Et voici un extrait de mon ConfigurationModel:

public bool DontUseSensorLength
{
    get { return !UseSensorLength; }
}

public bool UseSensorLength
{
   get { return _useSensorLength; }
   set 
   { 
      _useSensorLength = value; 
      OnPropertyChanged("UseSensorLength"); 
      OnPropertyChanged("DontUseSensorLength");
   }
}

Voici le message d'erreur que je reçois dans ma fenêtre de sortie lors de l'exécution de l'application:

Erreur System.Windows.Data: 40: Erreur de chemin BindingExpression: Propriété 'ConfigurationModel' introuvable sur 'objet' '' IncrementingTextBox '(Name =' video_length_textbox ')' . BindingExpression: Path = ConfigurationModel.DontUseSensorLength; DataItem = 'IncrementingTextBox' (Name = 'video_length_textbox'); cible l'élément est 'IncrementingTextBox' (Name = 'video_length_textbox'); cible la propriété est 'IsEnabled' (type 'Boolean')

N'oubliez pas que la liaison de la propriété 'UseSensorLength' fonctionne correctement, mais que la liaison 'DontUseSensorLength' provoque l'erreur 'BindingExpression path' ci-dessus.

37
Curtis

J'ai récemment écrit une SO answer réponse sur la façon de lire les erreurs de reliure afin qu'elles aient plus de sens. Pour résumer, ajoutez des sauts de ligne à votre message d'erreur sur les deux points et points-virgules et lisez-le de bas en haut.

Votre message d'erreur est:

  • Erreur System.Windows.Data: 40:
    • Erreur de chemin BindingExpression: propriété 'ConfigurationModel' non trouvée sur 'objet' '' IncrementingTextBox '(Name =' video_length_textbox ')'. 
    • BindingExpression: Path = ConfigurationModel.DontUseSensorLength; 
  • DataItem = 'IncrementingTextBox' (Name = 'video_length_textbox'); 
  • l'élément cible est 'IncrementingTextBox' (Name = 'video_length_textbox'); 
  • la propriété cible est 'IsEnabled' (type 'Boolean')

Ceci peut être lu de bas en haut comme:

  • La liaison qui échoue est la propriété IsEnabled d'un élément de type IncrementingTextBox (nommé video_length_textbox).

  • La DataItem (DataContext) de l'élément est un objet de type IncrementingTextBox nommé video_length_textbox

  • L'expression de liaison recherchée est ConfigurationModel.DontUseSensorLength

  • Et le problème que la liaison a est que la propriété ConfigurationModel est introuvable sur l'objet de contexte de données IncrementingTextBox

Donc, votre DataContext pour "video_length_textbox" est défini sur lui-même et votre classe IncrementingTextBox ne possède pas de propriété publique appelée ConfigurationModel

Comme je ne vois pas que vous définissiez la variable DataContext pour votre IncrementingTextBox dans votre code XAML, consultez le code de votre classe IncrementingTextBox. Le cas le plus probable est que vous définissez le DataContext sur lui-même, soit dans le constructeur.

this.DataContext = this;

ou le XAML

DataContext="{Binding RelativeSource={RelativeSource Self}}"
94
Rachel

J'ai eu le même problème parce que la classe d'objet à partir de laquelle je tirais les données n'avait pas eu; Et mettre; sur ses propriétés.

cela n'a pas fonctionné: 

public string Name;

mais cela a fonctionné: 

public string Name{ get; set; }
51
Janiiik

Peu de choses à vérifier

1.assigner des valeurs dans les propriétés avant InitializeComponent dans le constructeur

 public partial class SampleClass: UserControl
{
    public SampleClass()
    {
        ScenarioHeight = System.Windows.SystemParameters.WorkArea.Height - 350;
        InitializeComponent();           


    }

    public double ScenarioHeight  { get;set;}

2.si c'est un usercontrol, assurez-vous d'ajouter userControl en tant qu'élément dans la liaison

 <ScrollViewer Name="sv" Height="{Binding Path=ScenarioHeight, ElementName=ucSampleClass}" >
1
Shahid

J'ai eu le même problème et dans mon cas, j'utilisais bool au lieu de Boolean. Dès que je l'ai changé, cela fonctionne comme prévu.

1
BlackM

Cette erreur peut également se produire lorsque vous tentiez précédemment de lier une instance énumérable inaccessible ou non existante à l'aide de la propriété XAML <ItemsSource>

Lorsque vous corrigez la valeur ItemsSource avec la valeur correcte, XAML ne réinitialise pas automatiquement la collection d'éléments.

Ainsi, lorsque j’utilisais l’interface utilisateur ListBox - la représentation sous forme de liste, j’ai fait face à cela dans les propriétés:

 enter image description here

La suppression de tous les éléments de la collection et la correction de la valeur ItemSource étaient la clé.

1
Max Bender

J'ai eu une expérience similaire, la liaison ItemsSource sur une Combobox ne fonctionnait pas.

Dans mon cas, c'était une erreur mineure, mais difficile à suivre jusqu'à ce que j'active les messages de trace.

J'oublie simplement de transformer ma liste en une propriété :(

// NOPE:
public List<string> Versions;
// YEP:
public List<string> Versions { get; set; }

Peut-être que cela aide quelqu'un ...

0
uceumern