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.
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 typeIncrementingTextBox
(nommé video_length_textbox).L'
DataItem
(DataContext
) de l'élément est un objet de typeIncrementingTextBox
nommé video_length_textboxL'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éesIncrementingTextBox
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}}"
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; }
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.
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}" >
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:
La suppression de tous les éléments de la collection et la correction de la valeur ItemSource
était la clé.