У меня есть метод поиска, который ищет источник данных TreeView, загружает все ветви, которые еще не были загружены, выбирает соответствующую ветку и отображает связанные элементы в ListView. Теперь я хочу убедиться, что выбранный элемент отображается в TreeView, используя метод TreeViewItem
BringIntoView()
. Однако я читал, что непосредственное взаимодействие с представлением в вашей модели представления нарушает шаблон MVVM. У меня есть следующие методы (благодаря pushpraj для метода ContainerFromItem
из этого вопроса - Получить TreeViewItem для TreeView логический элемент ):
public static void SelectedItemChanged(object sender, System.Windows.RoutedPropertyChangedEventArgs<object> e)
{
var tv = (TreeView)sender;
var item = ContainerFromItem(tv.ItemContainerGenerator, e.NewValue);
item.BringIntoView();
}
private static TreeViewItem ContainerFromItem(ItemContainerGenerator containerGenerator, object item)
{
TreeViewItem container = (TreeViewItem)containerGenerator.ContainerFromItem(item);
if (container != null)
return container;
foreach (object childItem in containerGenerator.Items)
{
TreeViewItem parent = containerGenerator.ContainerFromItem(childItem) as TreeViewItem;
if (parent == null)
continue;
container = parent.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
if (container != null)
return container;
container = ContainerFromItem(parent.ItemContainerGenerator, item);
if (container != null)
return container;
}
return null;
}
Я предполагаю размещение этого в модели представления сломал бы образец MVVM. Так должно ли это быть в Кодексе позади? или это должно остаться пустым? Иначе, есть ли альтернативный метод для достижения этого, который больше подходит для шаблона MVVM?