Что вы делаете неправильно?
Я бы сказал то, что вы делаете неправильно, пытается получить доступ к элементам внутри DataTemplate из кода. Непослушный, озорной!
Все шутки в сторону, 99,9% времени Я вижу, что кто-то пытается получить доступ к элементу внутри DataTemplate из кода, потому что их приложение плохо спроектировано без каких-либо (или нескольких) привязок и вообще нет модели просмотра. Многие новички обычно хранят свои данные непосредственно в элементах пользовательского интерфейса, а не используют модель представления. Я думаю, это потому, что их разум был поврежден опытом VB, WinForms и ASP.NET, где это был «нормальный» способ сделать это. Существует тысяча причин использовать модель представления и привязать ваши данные вместо их хранения в элементах пользовательского интерфейса. Посмотрите «модель представления модели модели» онлайн для более подробной информации.
Теперь, чтобы ответить на ваш вопрос:
Любой данный ListBoxItem может иметь только один DataTemplate в то время. Это связано с тем, что ContentPresenter имеет только одно свойство ContentTemplate, и это свойство не может иметь двух разных значений.
Из-за этого визуальное дерево под ListBoxItem всегда будет генерироваться из одного конкретного шаблона, а не из нескольких шаблонов. Если вы измените ItemTemplate в ListBox или иным образом обновите ListBoxItem.ContentTemplate, визуальное дерево, созданное старым шаблоном, будет выброшено, а новое построено.
Позвольте мне сказать это еще раз: если вы измените шаблоны данных, то визуальное дерево, созданное старым шаблоном данных, будет выброшено, а новое визуальное дерево построено.
У вас может быть сотен шаблонов данных, определенных и используемых в данном ListBoxItem, но только по одному может быть создано визуальное дерево для него. И это единственные элементы, которые фактически существуют как часть визуального дерева. Все остальные шаблоны существуют только как шаблоны - для них не созданы реальные элементы.
Другими словами: бессмысленно задавать вопрос о том, как найти элементы в двух разных визуальных деревьях, созданных двумя разными шаблонами в одном элементе управления, поскольку один элемент управления не может одновременно иметь два разных шаблона.
Надеюсь, что это очистит вас.
Окончательный совет: прочитайте на MVVM и прекратите попытки доступа к элементам внутри DataTemplates как можно скорее. Однако, если вы думаете, что можете быть в этом 0.1%, у которых действительно есть веские причины для доступа к элементам внутри шаблонов, напишите назад с вашей фактической причиной для этого, и, возможно, я смогу предоставить дополнительные рекомендации.
Hi Ray, Спасибо за отзыв. Однако мне удалось разобраться. Он не работал, потому что я пытался получить доступ к нему через обработчик обработчика ListBox_Selection, и по какой-то причине он передает NULL obj в метод FindVisualChild. Я переместил код в обработчик событий, я должен использовать его, изменил «IsSyncronisedWithCurrentItem» на True, и он сработал. Однако вы правы. Я начинающий разработчик, начиная с VB.NET, наткнулся на WPF и влюбился в него. Еще так много для меня, чтобы учиться и понимать. – GaaTY
Я понимаю, где вы находитесь: однажды я был новичком WPF. Придерживайтесь этого - WPF имеет сравнительно долгую кривую обучения, но то, что вы можете сделать с ней, когда вы там, просто потрясающе! –