2010-06-12 2 views
1

У меня есть 2 DataTemplates, определенные для элемента управления Listbox. 1 Template для UnSelected State, а другой - для выбранного состояния (более подробно, чем UnSelected State).Доступ к элементам внутри DataTemplate ... Как для более чем 1 DataTemplate?

Я последовал примеру здесь:

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.

Что я могу делать неправильно?

ответ

1

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

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

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

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

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

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

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

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

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

Надеюсь, что это очистит вас.

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

+0

Hi Ray, Спасибо за отзыв. Однако мне удалось разобраться. Он не работал, потому что я пытался получить доступ к нему через обработчик обработчика ListBox_Selection, и по какой-то причине он передает NULL obj в метод FindVisualChild. Я переместил код в обработчик событий, я должен использовать его, изменил «IsSyncronisedWithCurrentItem» на True, и он сработал. Однако вы правы. Я начинающий разработчик, начиная с VB.NET, наткнулся на WPF и влюбился в него. Еще так много для меня, чтобы учиться и понимать. – GaaTY

+0

Я понимаю, где вы находитесь: однажды я был новичком WPF. Придерживайтесь этого - WPF имеет сравнительно долгую кривую обучения, но то, что вы можете сделать с ней, когда вы там, просто потрясающе! –

2

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

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