Доступ к элементам внутри DataTemplate ... Как использовать более 1 DataTemplate? - PullRequest
1 голос
/ 12 июня 2010

У меня есть 2 DataTemplates, определенные для элемента управления Listbox.1 Шаблон предназначен для невыбранного состояния, а другой - для выбранного состояния (показывает больше деталей, чем невыбранное состояние).

Я следовал приведенному ниже примеру:

http://blogs.msdn.com/b/wpfsdk/archive/2007/04/16/how-do-i-programmatically-interact-with-template-generated-elements-part-ii.aspx

о том, как получить доступ к Элементам внутри DataTemplates из кода позади.

Я правильно понял, но он только находит и возвращает элемент UnSelected DataTemplate.Но когда я ищу элемент в Selected DataTemplate, я получаю исключение NullReferenceException.

Что я могу делать не так?

Ответы [ 2 ]

3 голосов
/ 07 февраля 2012

Настройка фокуса клавиатуры может быть одной из причин, по которой вам нужен доступ к элементам таблицы данных.MVVM не решит эту проблему, и FocusManager не устанавливает фокус клавиатуры.

1 голос
/ 13 июня 2010

Что вы делаете неправильно?

Я бы сказал что вы делаете неправильно, пытаясь получить доступ к элементам внутри шаблона данных из кода. Непослушный, непослушный!

Если не считать шуток, то в 99,9% случаев я вижу, как кто-то пытается получить доступ к элементу внутри DataTemplate из кода, это потому, что его приложение плохо спроектировано, без (или нескольких) привязок и вообще без модели представления.Многие новички склонны хранить свои данные непосредственно в элементах пользовательского интерфейса, а не использовать модель представления.Я думаю, это потому, что их умы были испорчены опытом VB, WinForms и ASP.NET, где это был «нормальный» способ сделать это.Существует тысяча причин использовать модель представления и связывать свои данные вместо хранения их в элементах пользовательского интерфейса.Посмотрите "модель представления модели" онлайн для получения более подробной информации.

Теперь, чтобы ответить на ваш вопрос:

Любой данный ListBoxItem может иметь только один DataTemplate одновременно.Это потому, что его ContentPresenter имеет только одно свойство ContentTemplate, и это свойство не может иметь два разных значения.

Из-за этого визуальное дерево в ListBoxItem всегда будет генерироваться из одного конкретного шаблона, а не из комбинациинесколько шаблонов.Если вы измените ItemTemplate объекта ListBox или иным образом обновите ListBoxItem.ContentTemplate, визуальное дерево, созданное старым шаблоном, будет отброшено, а новое построено.

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

Вы можете иметь сотню шаблонов данных, определенных и используемых для данного ListBoxItem, но толькопо одному может быть создано для него визуальное дерево.И это единственные элементы, которые на самом деле существуют как часть визуального дерева.Все остальные шаблоны существуют только в качестве шаблонов - для них не создано ни одного фактического элемента.

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

Надеюсь, это прояснит ситуацию для вас.

Итоговый совет: прочитайте MVVM и остановитесьпытаясь получить доступ к элементам внутри DataTemplates как можно скорее.Однако, если вы считаете, что у вас могут быть те 0,1%, у которых действительно есть веские причины для доступа к элементам внутри шаблонов, напишите свою реальную причину желания сделать это, и, возможно, я смогу дать дальнейшие рекомендации.

...