У меня есть <ItemsControl> с кастомным <DataTemplate> (а также кастомный <ItemsPanelTemplate>, который является просто WrapPanel), привязанный через ItemsSource к простой наблюдаемой коллекции строк.
DataTemplate состоит просто из экземпляра настраиваемого UserControl, свойства которого привязаны к строке через {Binding}.
Проблема в том, что поскольку мои элементы данных представляют собой просто строки, мне нужно получить доступ к экземплярам моего UserControl напрямую программно, но я не могу понять, как это сделать!
Я пытался:
var item = tagBar.Items[ tagBar.Items.Count - 1 ];
... но это просто возвращает строку. Также:
var item2 = tagBar.ItemContainerGenerator.ContainerFromIndex( tagBar.Items.Count - 1 );
... возвращает ContentPresenter, и я не могу понять, что делать с ContentPresenter, чтобы добраться до экземпляра моего UserControl.
??
Это похоже на этот вопрос, но на него так и не ответили должным образом, и он также характерен для Silverlight, тогда как это WPF.





Ответ, который я опубликовал, сюда касается фокусировки элемента внутри DataTemplate, но он должен предоставлять нужный вам код. Он включает использование метода FindName в шаблоне DataTemplate для поиска в нем элемента управления. Если вы дадите своему UserControl имя, вы должны быть правы.
Отлично, у вас получилось! Ключ передавал item (или, скорее, item2 в моем приведенном выше коде) обратно в tagBar.ItemTemplate.FindName() (и, конечно же, давал UserControl имя, по которому его можно было найти). Я также буду осторожен с битом IsLoaded, хотя он и нужен. Спасибо!
@ chaiguy1337 - похоже, что с тех пор, как вы это написали, была добавлена поддержка обратных кавычек, поскольку теперь текст проходит через форматирование.
Прежде чем кто-то предложит это, item2.Content также просто возвращает строку. вздох