2013-04-23 2 views
30

Я ударился головой о стол, с этой ошибкой привязки. Я проверил несколько сообщений об ошибке пути BindingExpression и не вижу ничего, что работает с моей ситуацией.Ошибка WPF 40 BindingExpression path error: свойство не найдено в 'object'

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

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

Однако привязка к объекту IncrementingTextBoxIsEnabled вызывает ошибку пути BindingExpression и поэтому не обновляет ее вообще.

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

Вот отрывок из моего 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"); 
    } 
} 

Вот сообщение об ошибке я получаю в моем окне вывода при запуске app:

System.Windows.Data Error: 40 : BindingExpression path error: 'ConfigurationModel' property not found on 'object' ''IncrementingTextBox' (Name='video_length_textbox')'. BindingExpression:Path=ConfigurationModel.DontUseSensorLength; DataItem='IncrementingTextBox' (Name='video_length_textbox'); target element is 'IncrementingTextBox' (Name='video_length_textbox'); target property is 'IsEnabled' (type 'Boolean')

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

+1

Можете ли вы опубликовать сообщение об ошибке, которое вы получаете из окна вывода? –

+0

Я добавил текст сообщения об ошибке в вышеуказанную публикацию. – Curtis

+2

Вы должны установить DataContext для отображения текущего пользовательского элемента управления. Когда вы создаете привязку, он ищет в DataContext 'IncrementingTextBox' значение' ConfigurationModel.DontUseSensorLength'. Вы должны использовать 'RelativeSource', подобный [this] (http://stackoverflow.com/a/11550721/1466627). –

ответ

83

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

Ваше сообщение об ошибке: Ошибка пути

  • BindingExpression::

    • System.Windows.Data Ошибка: 40 Свойство 'ConfigurationModel' не найден 'объект' '' «IncrementingTextBox (Name = 'video_length_textbox')».
    • BindingExpression: Path = ConfigurationModel.DontUseSensorLength;
  • DataItem = 'IncrementingTextBox' (Name = 'video_length_textbox');
  • Целевой элемент - «IncrementingTextBox» (Name = 'video_length_textbox');
  • целевой свойство «IsEnabled» (тип «Логическое»)

Это можно прочитать снизу вверх, как:

  • Связывание недостаток является 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}}" 
+1

Рэйчел, ты красивый гений !!! И я идиот. Большое вам спасибо за решение. Я был привязан к себе и не имел свойства «ConfigurationModel» в моем классе IncrementingTextBox. Опять же, спасибо !!! По какой-то причине я просто не могу обернуть голову вокруг привязки иногда. Я стараюсь использовать ее все время, но, похоже, регулярно сталкиваются с немыми ошибками Кертиса. В конце концов я выясню это. – Curtis

+5

@Curtis Не волнуйтесь, это становится легче, как только вы поймете, как работает WPF. Вам может быть интересно прочитать начальную запись в блоге у меня: [Что это за «DataContext», о котором вы говорите?] (Http://rachel53461.wordpress.com/2012/07/14/what-is-this-datacontext- вы-говорить-о /).Итак, приложение WPF имеет два уровня: слой данных (DataContext) и слой пользовательского интерфейса. Привязки используются для вытаскивания данных из слоя данных в слой пользовательского интерфейса, а уровень пользовательского интерфейса действительно предназначен только для удобного интерфейса для уровня данных. Как только вы научитесь сохранять эти слои отдельно, становится легко :) – Rachel

+1

Спасибо @Rachel, это было очень полезно! – Phasma

39

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

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

public string Name; 

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

public string Name{ get; set; } 
+2

Да, это не может быть поле, это должно быть свойство. Это была моя проблема. – seabass2020

+0

Спасибо, я вводил в заблуждение учебник. Должна быть собственностью. –

+2

У меня была такая же проблема, и мне не хватало публичного доступа! Иногда решение проще, чем кажется. – Korangar

0

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

0

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

1.assign значения свойств, прежде чем InitializeComponent в конструкторе

public partial class SampleClass: UserControl 
{ 
    public SampleClass() 
    { 
     ScenarioHeight = System.Windows.SystemParameters.WorkArea.Height - 350; 
     InitializeComponent();   


    } 

    public double ScenarioHeight { get;set;} 

2.Если сво UserControl забудьте добавить UserControl в качестве элемента в связывающем

<ScrollViewer Name="sv" Height="{Binding Path=ScenarioHeight, ElementName=ucSampleClass}" > 
Смежные вопросы