c# - databind - WPF Error 40 BindingExpression error de ruta: propiedad no encontrada en ''object''
data binding c# (5)
Me estoy golpeando la cabeza en mi escritorio con este error de enlace. He revisado varias publicaciones para el error de ruta de BindingExpression
y no puedo ver nada que funcione con mi situación.
De todos modos, tengo un control personalizado llamado IncrementingTextBox
. Intento desactivarlo cada vez que el usuario ''revisa'' el CheckBox
sobre él.
Tengo un enlace en la propiedad CheckBox
IsChecked
que funciona bien y se activa cuando se supone que debe hacerlo. Está configurando correctamente la propiedad UseSensorLength
en ConfigurationModel.
Sin embargo, el enlace en la propiedad IsEnabled
IncrementingTextBox
está causando un error de ruta BindingExpression
y por lo tanto no se actualiza en absoluto.
Como prueba, probé con el código subyacente para habilitar y deshabilitar el control y funciona muy bien, pero parece que no puedo hacer que el Enlace trabaje en él.
Aquí hay un fragmento de mi 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"/>
Y aquí hay un fragmento de mi ConfigurationModel:
public bool DontUseSensorLength
{
get { return !UseSensorLength; }
}
public bool UseSensorLength
{
get { return _useSensorLength; }
set
{
_useSensorLength = value;
OnPropertyChanged("UseSensorLength");
OnPropertyChanged("DontUseSensorLength");
}
}
Aquí está el mensaje de error que recibo en la ventana de salida cuando ejecuto la aplicación:
Error de System.Windows.Data: 40: Error de ruta de BindingExpression: la propiedad ''ConfigurationModel'' no se encuentra en ''object'' '''' IncrementingTextBox ''(Name ='' video_length_textbox '')''. BindingExpression: Path = ConfigurationModel.DontUseSensorLength; DataItem = ''IncrementingTextBox'' (Name = ''video_length_textbox''); el elemento objetivo es ''IncrementingTextBox'' (Name = ''video_length_textbox''); la propiedad de destino es ''IsEnabled'' (escriba ''Boolean'')
Recuerde, el enlace de la propiedad ''UseSensorLength'' está funcionando bien, pero el enlace ''DontUseSensorLength'' está causando el ''error de ruta de BindingExpression'' anterior.
Este error también puede ocurrir cuando anteriormente intentaba vincular una instancia de Enumerable inaccesible o no existente utilizando la propiedad XAML <ItemsSource>
Cuando corrige el ItemsSource
con el valor correcto, XAML no vuelve a inicializar automáticamente la colección de elementos.
Entonces, cuando estaba usando la IU ListBox
- lista de representación me enfrenté a esto en las propiedades:
La clave está en eliminar todos los elementos de la colección y corregir el valor de ItemSource
.
Pocas cosas para verificar
1. asignar valores en las propiedades antes de InitializeComponent en el constructor
public partial class SampleClass: UserControl
{
public SampleClass()
{
ScenarioHeight = System.Windows.SystemParameters.WorkArea.Height - 350;
InitializeComponent();
}
public double ScenarioHeight { get;set;}
2. si es un control de usuario asegúrese de agregar userControl como Element en el enlace
<ScrollViewer Name="sv" Height="{Binding Path=ScenarioHeight, ElementName=ucSampleClass}" >
Recientemente escribí otra answer SO sobre cómo leer los errores de enlace para que tengan más sentido. Para resumir, agregue saltos de línea a su mensaje de error en los dos puntos y coma y léelo de abajo hacia arriba.
Su mensaje de error es:
- System.Windows.Data Error: 40:
- Error de ruta BindingExpression: la propiedad ''ConfigurationModel'' no se encuentra en ''object'' '''' IncrementingTextBox ''(Name ='' video_length_textbox '')''.
- BindingExpression: Path = ConfigurationModel.DontUseSensorLength;
- DataItem = ''IncrementingTextBox'' (Name = ''video_length_textbox'');
- el elemento objetivo es ''IncrementingTextBox'' (Name = ''video_length_textbox'');
- la propiedad de destino es ''IsEnabled'' (escriba ''Boolean'')
Esto puede leerse de abajo arriba como:
La falla de enlace es la propiedad
IsEnabled
de un elemento de tipoIncrementingTextBox
(named video_length_textbox).El
DataItem
(DataContext
) del elemento es un objeto de tipoIncrementingTextBox
named video_length_textboxLa expresión de enlace que está tratando de encontrar es
ConfigurationModel.DontUseSensorLength
Y el problema que está teniendo el enlace es que la propiedad
ConfigurationModel
no se encuentra en el objeto de contexto de datosIncrementingTextBox
Así que su DataContext
para "video_length_textbox" está configurado a sí mismo, y su clase IncrementingTextBox
no tiene una propiedad pública llamada ConfigurationModel
Como no veo configurar el DataContext
para su IncrementingTextBox
en ninguna parte de su XAML, consulte el código de su clase IncrementingTextBox
. El caso más probable es que esté configurando el DataContext para sí mismo en el Constructor
this.DataContext = this;
o el XAML
DataContext="{Binding RelativeSource={RelativeSource Self}}"
Tuve el mismo problema porque la clase de objeto de la que estaba extrayendo datos no tiene get; y establecer; en sus propiedades.
esto no funcionó
public string Name;
pero esto funcionó:
public string Name{ get; set; }
Tuve el mismo problema y en mi caso estaba usando bool
lugar de Boolean
. Tan pronto como lo cambié, está funcionando como se esperaba.