#wpf #mvvm #expander
#wpf #mvvm #расширитель
Вопрос:
Я пишу интерфейс конфигурации MVVM и пытаюсь реализовать функцию развернуть / свернуть все, которая применяется ко всем представлениям.
ViewModel верхнего уровня представляет собой однородную коллекцию других ViewModels, которая привязана к ItemsControl в представлении. Каждая из этих дочерних ViewModels имеет ряд зависимых ViewModels, каждая из которых привязана к ContentControl в представлении. Визуально это выглядит как набор расширителей (скажем, 3 из них), внутри каждого из которых спрятано 4-6 расширителей.
Я пробовал методы поиска сверху вниз. Поскольку расширители верхнего уровня свернуты, их дочерние расширители даже не существуют, пока они не будут показаны в первый раз (Caliburn.Micro выполняет для них просмотр местоположения при первом запросе), а действие «развернуть все» расширяет только первый уровень.
Логическое дерево тоже не помогает. Items
Свойство ItemsControl верхнего уровня на самом деле содержит объекты моего типа ViewModel, поэтому я не могу искать расширители внутри них.
Я думал управлять этим на уровне ViewModel, но добавление IsExpanded
свойства ко всем виртуальным машинам и настройка его с помощью какого-либо глобального менеджера кажется запутанным. У виртуальной машины нет другой причины знать, какие расширители расширены.
Каков наилучший способ справиться с этим? Есть ли какой-нибудь трюк с привязкой присоединенных свойств, который я мог бы использовать?
Комментарии:
1. Извините, но я не уверен, что понял, чего вы пытаетесь достичь, что вы хотите сделать со свойством IsExpanded для каждой виртуальной машины? Привязан к XAML или как-то обработан?
2. Нет, это все на визуальном уровне; Я пытаюсь установить
IsExpanded
свойство всех элементов управления расширителем.
Ответ №1:
Ваша ViewModel должна иметь функцию, которая сама расширяется и вызывает ту же функцию в своих дочерних элементах.
public abstact class BaseItem
{
public List<BaseItem> Children;
public virtual void SetSelfAndChildrenExpandedState(bool inState)
{
// Expand Self
IsExpanded = inState;
// Expand Children
foreach (BaseItem i in Children)
{
i.SetSelfAndChildrenExpandedState(inState);
}
}
public bool IsExpanded { get; set; }
}
Теперь вам просто нужно подключить ваше действие «развернуть все» для вызова SetSelfAndChildrenExpandedState() с соответствующим параметром.
Это может сработать для вас … подумайте об этом.
Комментарии:
1. Я пытался избежать того, чтобы это стало проблемой viewmodel, но этот подход отлично сработал. На самом деле я в конечном итоге унаследовал от
ReactiveObject
и использовалallPublicProperties
помощник. Спасибо!