Erreur WPF 40 erreur de chemin BindingExpression: propriété introuvable sur 'object'

Je me tape la tête sur mon bureau avec cette erreur de liaison.. J'ai vérifié plusieurs des messages pour l'erreur BindingExpression path et je ne peux rien voir qui fonctionne avec 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" le CheckBox au-dessus.

J'ai une liaison sur le CheckBox IsChecked propriété qui fonctionne bien et qui tire quand elle est supposée le faire. Il définit correctement la propriété UseSensorLength sur le ConfigurationModel.

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

En tant que test, j'ai essayé dans le code derrière pour activer et désactiver le contrôle et cela fonctionne très bien, mais je n'arrive pas à faire fonctionner la liaison.

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:

Système.Windows.Erreur de données: 40: BindingExpression erreur de chemin: Propriété 'ConfigurationModel' introuvable sur 'object' "IncrementingTextBox' (Nom='video_length_textbox')'. BindingExpression: Chemin = ConfigurationModel.DontUseSensorLength; Datatem= ' IncrementingTextBox '(Name= 'video_length_textbox'); cible élément est "IncrementingTextBox' (Nom='video_length_textbox'); cible la propriété est ' IsEnabled '(type 'Boolean')

Rappelez-vous, la liaison de la propriété 'UseSensorLength' fonctionne bien, mais la liaison' DontUseSensorLength 'provoque l'erreur de chemin'bindingexpression' ci-dessus.

34
demandé sur Andreas Niedermair 2013-04-23 19:52:24

5 réponses

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

Votre message d'erreur est:

  • système.Windows.Erreur De Données: 40 :
    • erreur de chemin BindingExpression:' ConfigurationModel 'propriété introuvable sur 'object' "IncrementingTextBox' (Name= 'video_length_textbox')'.
    • BindingExpression: Path = ConfigurationModel.DontUseSensorLength;
  • DataItem='IncrementingTextBox' (Nom='video_length_textbox');
  • l'élément cible est ' IncrementingTextBox '(Name = 'video_length_textbox');
  • la propriété cible est ' IsEnabled '(type 'Boolean')

Cela peut être lu de bas en haut comme:

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

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

  • L'expression de liaison c'est d'essayer de trouver est ConfigurationModel.DontUseSensorLength

  • Et le problème de la liaison est que la propriété ConfigurationModel n'est pas trouvée sur l'objet contexte de données IncrementingTextBox

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

Puisque je ne vous vois pas définir le DataContext pour votre IncrementingTextBox n'importe où dans votre XAML, consultez le code de votre classe IncrementingTextBox. Le cas le plus probable est que vous définissez le DataContext lui - même dans le constructeur

this.DataContext = this;

Ou le XAML

DataContext="{Binding RelativeSource={RelativeSource Self}}"
89
répondu Rachel 2017-05-23 12:10:26

J'ai eu le même problème car la classe d'objet à partir de laquelle je retirais des données n'avait pas get; et set; sur ses propriétés.

Cela n'a pas fonctionné:

public string Name;

, Mais cela a fonctionné:

public string Name{ get; set; }
51
répondu Janiiik 2016-04-27 18:10:08

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é, ça marche comme prévu.

0
répondu BlackM 2017-03-17 13:07:24

Peu de choses à vérifier

1.attribuer 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 comme élément dans la liaison

 <ScrollViewer Name="sv" Height="{Binding Path=ScenarioHeight, ElementName=ucSampleClass}" >
0
répondu Shahid 2017-03-22 22:10:06

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

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

Donc, quand j'utilisais la représentation ListBox UI-list, j'ai fait face à cela dans les propriétés:

entrez la description de l'image ici

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

0
répondu Max Bender 2018-03-11 18:58:46