Неправильно ли обращаться к TreeViewItems в WPFs TreeView?

У меня возникли проблемы с TreeView в WPF. Этот элемент управления делает его очень трудным для доступа к его показанию TreeViewItem.

Несколько раз я работал над необходимостью доступа к TreeViewItem, например, я принял тот факт, что Im не должен обращаться к родителю node через TreeView (и я должен вместо этого следить за родителем). Ive делал это по двум причинам: во-первых, очевидно, что чрезвычайно сложно попасть в TreeViewItem s, а во-вторых, мне сказали, что его сложно, потому что Im не должен их нуждаться если я все сделаю правильно.

Однако на этот раз я действительно не вижу этого.

В принципе, все, что я хочу, с учетом одного из моих экземпляров viewmodel, прокручивает древовидное представление к нему. Это тривиально, если бы я мог просто получить соответствующий TreeViewItem.

Я снова делаю что-то неправильно, пытаясь добраться до TreeViewItem, или это будет правильный подход?

Ответ 2

По общему признанию, это не просто, но вы, возможно, все еще можете это сделать, сохраняя разделение, которое не требует от вас доступа к TreeViewItems сознательно. Суть в WPF обязательна как уже отмеченная Kent Boogaart в вашем другом вопросе, но здесь вам нужно как-то разобраться с событиями. Ваша модель просмотра должна запускать собственное событие BringIntoView, в то время как представление должно реагировать.

Самый простой способ - добавить EventSetter на Loaded, чтобы TreeViewItems подписаться на указанное событие на их DataContext, которое должно быть вашей моделью представления (если вы не можете ждать DataContextChanged).

Ответ 3

Нет, я не вижу, как правильно обращаться к элементам дерева.

Я думаю, что трудности, с которыми вы сталкиваетесь, связаны с тем, что вы не видите древовидное изображение, как должно быть.

У листа есть родитель, но нет детей. A node может иметь родителя и иметь детей. A node без родителя - это корень.

На основе этих принципов (SourceMaking Composite pattern) вы сможете делать все, что хотите, используя рекурсию. (как в XAML, так и в коде)

Ответ 4

Я пришел к выводу, что он не может быть совершенно неправильным. Первое доказательство приходит из Bea Stollnitzs публикует о ListView: если один из разработчиков WPF объяснит, как это можно сделать, возможно, это неправильно.

Другая часть доказательств исходит из этого высокопоставленного вопроса/ответа: безумие MVVM. MVVM, несомненно, имеет свои преимущества, но иногда стоимость следующего MVVM настолько высока, что его просто глупо следовать с ним, особенно в небольшом одномандатном приложении. Вы действительно хотите выставить IsSelected и IsExpanded способ, которым вы должны?

В результате я счел оправданным попытаться выяснить, как выявить TreeViewItem, соответствующий элементу, с меньшими усилиями разработчика, исходя из предположения, что им никогда не понадобятся более сложные функции, которые привели к TreeViewItem быть труднодоступным (например, отображать одни и те же ViewModels в нескольких разных элементах управления... как часто вам это нужно!)

Я опубликовал результат этого усилия как ответ по другому вопросу.