2015-06-11 4 views
3

У меня возникла очень странная проблема. Я пытаюсь связать свойство с DataContext, но он не работает. Это то, что я делаю (в разделе Window.Resources):Не удалось привязать к DataContext

<myNS:MyClass x:Key="myObj" MyProp="{Binding}"/> 

В другом месте в коде, я поставил контекст данных, как это:

myWindow.DataContext = MyNameSpace.MySingleton.Instance; 

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

<myNS:MyClass x:Key="myObj" MyProp="{Binding Converter={StaticResource Debug}}"/> 

я поставил точку останова в конвертере и значение передается был нулевым. Полагая, что все было не в порядке, я установил точку останова на линии, которая устанавливает DataContext. Сначала это было поражено, затем точка останова в конвертере. Поэтому DataContext устанавливается до того, как произойдет привязка.

Наконец, чтобы попытаться получить что-то работать, я изменил к этому:

<myNS:MyClass x:Key="myObj" MyProp="{Binding Source={x:Static myNS:MySingleton.Instance}}"/> 

Это работало.

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

Может ли кто-нибудь объяснить, что я делаю неправильно здесь?

JAB

+0

«** В другом месте ** в коде я задал контекст данных». Где именно? – adPartage

+0

Если класс не является результатом FrameworkElement, он не является частью Visual Tree, поэтому DataContext не автоматически «унаследован». – Silvermind

ответ

0

Какой я идиот!

Я начал отвечать на @BradleyDotNET (спасибо за ответ, кстати, это помогло мне решить проблему) и разобрался в решении. Мой класс DOES получается из FrameworkElement. Я сделал это, потому что мне нужно было использовать привязку данных, хотя у нее нет видимого компонента.

Я разместил another question dealing with how to instantiate an object declared in the resource section. Я все равно хотел бы узнать ответ на этот вопрос, но поскольку мой класс происходит из FrameworkElement, мне не нужно объявлять его в разделе ресурсов; Я могу положить его прямо в дерево. Это вызывает его создание и наследует DataContext.

0

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

Таким образом, у них нет управляющего элемента FrameworkElement, чтобы получить контекст данных от. Обычно стандартный класс не будет использовать синтаксис привязки, поскольку он требует получения от DependencyObject, но если вам действительно нужно привязка в ресурсе (скажем, для конвертера), вы можете использовать этот трюк:

  1. Установите корневой элемент, чтобы иметь x:Name="Root"
  2. Используйте привязки, как это:

    MyProp="{Binding Source={x:Reference Root}, Path=DataContext.<YourProp>

Это связывается с использованием корнем п в качестве начальной точки, и вы можете нормально перейти к контексту данных.

Смежные вопросы