it-swarm.com.ru

Ошибка 40 WPF Ошибка пути BindingExpression: свойство не найдено в "объекте"

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

Во всяком случае, у меня есть пользовательский элемент управления под названием IncrementingTextBox. Я пытаюсь отключить его всякий раз, когда пользователь «проверяет» CheckBox над ним.

У меня есть привязка к свойству CheckBoxIsChecked, которое работает нормально и запускается, когда это необходимо. Он правильно устанавливает свойство UseSensorLength в ConfigurationModel.

Однако привязка к свойству IncrementingTextBoxIsEnabled вызывает ошибку пути 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"/>

А вот фрагмент из моей ConfigurationModel:

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» не найдено в «объекте» '' IncrementingTextBox '(Name =' video_length_textbox ')' . BindingExpression: Path = ConfigurationModel.DontUseSensorLength; DataItem = 'IncrementingTextBox' (Name = 'video_length_textbox'); целевой элемент 'IncrementingTextBox' (Name = 'video_length_textbox'); целевой свойство isEnabled (тип Boolean)

Помните, что привязка свойства «UseSensorLength» работает нормально, но привязка «DontUseSensorLength» вызывает вышеуказанную «ошибку пути BindingExpression».

37
Curtis

Недавно я написал SO answer - о том, как читать ошибки привязки, чтобы они стали более понятными. Подводя итог, добавьте разрывы строк в сообщение об ошибке в двоеточиях и точках с запятой и прочитайте его снизу вверх.

Ваше сообщение об ошибке:

  • Ошибка 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 (с именем 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}}"
94
Rachel

У меня была та же проблема, потому что класс объекта, из которого я извлекал данные, не имел; и установить; по своим свойствам.

это не сработало: 

public string Name;

но это сработало: 

public string Name{ get; set; }
51
Janiiik

Несколько вещей, чтобы проверить

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}" >
1
Shahid

У меня была та же проблема, и в моем случае я использовал bool вместо Boolean. Как только я его изменил, он работает как положено.

1
BlackM

Эта ошибка также может возникать, когда вы ранее пытались связать недоступный или несуществующий экземпляр Enumerable с помощью свойства XAML <ItemsSource>

Когда вы исправляете ItemsSource с правильным значением, XAML автоматически не реилитилизирует коллекцию элементов.

Поэтому, когда я использовал представление списка пользовательских интерфейсов ListBox, я столкнулся с этим в свойствах:

 enter image description here

Ключом было удаление всех элементов коллекции и исправление значения ItemSource.

1
Max Bender

У меня был подобный опыт, привязка ItemsSource на Combobox не работала.

В моем случае это была небольшая ошибка, но ее трудно было отследить, пока я не включил сообщения трассировки.

Я просто забываю превратить мой список в собственность :(

// NOPE:
public List<string> Versions;
// YEP:
public List<string> Versions { get; set; }

Может быть, это кому-то помогает ...

0
uceumern