Ответ 1
Взгляните на Упрощение WPF TreeView с помощью шаблона ViewModel от Джоша Смита. надеюсь, что это поможет.
У меня возникли проблемы с TreeView
в WPF. Этот элемент управления делает его очень трудным для доступа к его показанию TreeViewItem
.
Несколько раз я работал над необходимостью доступа к TreeViewItem
, например, я принял тот факт, что Im не должен обращаться к родителю node через TreeView (и я должен вместо этого следить за родителем). Ive делал это по двум причинам: во-первых, очевидно, что чрезвычайно сложно попасть в TreeViewItem
s, а во-вторых, мне сказали, что его сложно, потому что Im не должен их нуждаться если я все сделаю правильно.
Однако на этот раз я действительно не вижу этого.
В принципе, все, что я хочу, с учетом одного из моих экземпляров viewmodel, прокручивает древовидное представление к нему. Это тривиально, если бы я мог просто получить соответствующий TreeViewItem
.
Я снова делаю что-то неправильно, пытаясь добраться до TreeViewItem
, или это будет правильный подход?
Взгляните на Упрощение WPF TreeView с помощью шаблона ViewModel от Джоша Смита. надеюсь, что это поможет.
По общему признанию, это не просто, но вы, возможно, все еще можете это сделать, сохраняя разделение, которое не требует от вас доступа к TreeViewItems
сознательно. Суть в WPF обязательна как уже отмеченная Kent Boogaart в вашем другом вопросе, но здесь вам нужно как-то разобраться с событиями. Ваша модель просмотра должна запускать собственное событие BringIntoView
, в то время как представление должно реагировать.
Самый простой способ - добавить EventSetter
на Loaded
, чтобы TreeViewItems
подписаться на указанное событие на их DataContext
, которое должно быть вашей моделью представления (если вы не можете ждать DataContextChanged
).
Нет, я не вижу, как правильно обращаться к элементам дерева.
Я думаю, что трудности, с которыми вы сталкиваетесь, связаны с тем, что вы не видите древовидное изображение, как должно быть.
У листа есть родитель, но нет детей. A node может иметь родителя и иметь детей. A node без родителя - это корень.
На основе этих принципов (SourceMaking Composite pattern
) вы сможете делать все, что хотите, используя рекурсию. (как в XAML, так и в коде)
Я пришел к выводу, что он не может быть совершенно неправильным. Первое доказательство приходит из Bea Stollnitzs публикует о ListView: если один из разработчиков WPF объяснит, как это можно сделать, возможно, это неправильно.
Другая часть доказательств исходит из этого высокопоставленного вопроса/ответа: безумие MVVM. MVVM, несомненно, имеет свои преимущества, но иногда стоимость следующего MVVM настолько высока, что его просто глупо следовать с ним, особенно в небольшом одномандатном приложении. Вы действительно хотите выставить IsSelected
и IsExpanded
способ, которым вы должны?
В результате я счел оправданным попытаться выяснить, как выявить TreeViewItem
, соответствующий элементу, с меньшими усилиями разработчика, исходя из предположения, что им никогда не понадобятся более сложные функции, которые привели к TreeViewItem
быть труднодоступным (например, отображать одни и те же ViewModels в нескольких разных элементах управления... как часто вам это нужно!)
Я опубликовал результат этого усилия как ответ по другому вопросу.