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é CheckBox
IsChecked
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é IncrementingTextBox
IsEnabled
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.
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:
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}}"
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; }
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}" >
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.
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:
La suppression de tous les éléments de la collection et la correction de la valeur ItemSource
étaient la clé.
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 ...