MVVM Правильное место для взаимодействия с элементом пользовательского интерфейса или альтернативным методом - PullRequest
0 голосов
/ 03 марта 2020

У меня есть метод поиска, который ищет источник данных 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?

...