Подтвердить что ты не робот

Ошибка 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.

4b9b3361

Ответ 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

Я получил эту ошибку, и мой случай был так же прост, как установка строки, с которой я связывался, от частного к общему.

Неосторожная ошибка в написании моего бэк поля.