Ошибка WPF 40 Ошибка BindingExpression path: свойство не найдено в 'объекте'
Я ударяю головой на свой стол с этой ошибкой связывания. Я проверил несколько сообщений об ошибке пути BindingExpression
и не вижу ничего, что работает с моей ситуацией.
Во всяком случае, у меня есть настраиваемый элемент управления IncrementingTextBox
. Я пытаюсь отключить его, когда пользователь "проверяет" CheckBox
над ним.
У меня есть привязка к свойству CheckBox
IsChecked
, которое отлично работает и срабатывает, когда это предполагается. Он правильно устанавливает свойство UseSensorLength
на ConfigurationModel.
Однако привязка к свойству IncrementingTextBox
IsEnabled
вызывает ошибку пути BindingExpression
и поэтому не обновляется вообще.
В качестве теста я попытался в коде, чтобы включить и отключить элемент управления, и он работает отлично, но я не могу заставить Binding работать над ним.
Вот фрагмент из моего 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"/>
И вот фрагмент из моей конфигурации:
public bool DontUseSensorLength
{
get { return !UseSensorLength; }
}
public bool UseSensorLength
{
get { return _useSensorLength; }
set
{
_useSensorLength = value;
OnPropertyChanged("UseSensorLength");
OnPropertyChanged("DontUseSensorLength");
}
}
Вот сообщение об ошибке, которое я получаю в своем окне вывода при запуске приложения:
Ошибка System.Windows.Data: 40: Ошибка пути BindingExpression: Свойство ConfigurationModel не найдено в 'object' '' IncrementingTextBox '(Name=' video_length_textbox ')'. BindingExpression: Path = ConfigurationModel.DontUseSensorLength; DataItem = 'IncrementingTextBox' (Name= 'video_length_textbox'); цель element - "IncrementingTextBox" (Name= 'video_length_textbox'); цель property is IsEnabled (тип "Boolean" )
Помните, что привязка свойства UseSensorLength работает нормально, но привязка DontUseSensorLength вызывает вышеупомянутую ошибку пути BindingExpression.
Ответы
Ответ 1
Недавно я написал несколько других ответов SO о том, как читать ошибки привязки, чтобы они имели больше смысла. Чтобы подвести итог, добавьте разрывы строк в сообщение об ошибке в двоеточиях и полуколонах и прочитайте их снизу вверх.
Ваше сообщение об ошибке:
- Ошибка System.Windows.Data: 40:
- Ошибка пути BindingExpression: свойство ConfigurationModel не найдено в 'object' '' IncrementingTextBox '(Name=' video_length_textbox ')'.
- BindingExpression: Path = ConfigurationModel.DontUseSensorLength;
- DataItem = 'IncrementingTextBox' (Name= 'video_length_textbox');
- целевым элементом является "IncrementingTextBox" (Name= 'video_length_textbox');
- target свойство - IsEnabled (тип 'Boolean')
Это можно прочитать снизу вверх:
-
Ошибка привязки - это свойство IsEnabled
элемента типа IncrementingTextBox
(named video_length_textbox).
-
Элемент DataItem
(DataContext
) этого элемента является объектом типа IncrementingTextBox
с именем video_length_textbox
-
Выражение привязки, которое он пытается найти, это ConfigurationModel.DontUseSensorLength
-
И проблема, связанная с тем, что свойство ConfigurationModel
не найдено в объекте контекста данных IncrementingTextBox
Таким образом, ваш DataContext
для "video_length_textbox" настроен на себя, а ваш класс IncrementingTextBox
не имеет открытого свойства ConfigurationModel
Так как я не вижу, что вы устанавливаете DataContext
для своего IncrementingTextBox
в любом месте вашего XAML, проверьте код для своего класса IncrementingTextBox
. Наиболее вероятный случай заключается в том, что вы устанавливаете DataContext для себя либо в конструкторе
this.DataContext = this;
или XAML
DataContext="{Binding RelativeSource={RelativeSource Self}}"
Ответ 2
У меня была такая же проблема, потому что класс объекта, из которого я вытаскивал данные, не получал; и установить; по его свойствам.
это не сработало:
public string Name;
но это сработало:
public string Name{ get; set; }
Ответ 3
У меня была та же проблема, и в моем случае я использовал bool
вместо Boolean
. Как только я его сменил, он работает как ожидалось.
Ответ 4
Несколько вещей, чтобы проверить
1.Введите значения в свойствах до InitializeComponent в конструкторе
public partial class SampleClass: UserControl
{
public SampleClass()
{
ScenarioHeight = System.Windows.SystemParameters.WorkArea.Height - 350;
InitializeComponent();
}
public double ScenarioHeight { get;set;}
2.если его пользовательский контроль не забудьте добавить userControl как элемент в привязку
<ScrollViewer Name="sv" Height="{Binding Path=ScenarioHeight, ElementName=ucSampleClass}" >
Ответ 5
Эта ошибка также может возникать, когда вы ранее пытались связать недоступный или несуществующий экземпляр Enumerable с помощью свойства XAML <ItemsSource>
Когда вы исправляете ItemsSource
с правильным значением, XAML автоматически не реилитализирует коллекцию элементов.
Поэтому, когда я использовал ListBox
UI - представление списка, я столкнулся с этим в свойствах:
![enter image description here]()
ItemSource
было удаление всех элементов в коллекции и исправление значения ItemSource
.
Ответ 6
У меня был подобный опыт, привязка ItemsSource на Combobox не работала.
В моем случае это была небольшая ошибка, но ее трудно было отследить, пока я не включил трассировку сообщений.
Я просто забываю превратить мой список в собственность :(
// NOPE:
public List<string> Versions;
// YEP:
public List<string> Versions { get; set; }
Может быть, это кому-то помогает...
Ответ 7
Я получил эту ошибку, и мой случай был так же прост, как установка строки, с которой я связывался, от частного к общему.
Неосторожная ошибка в написании моего бэк поля.