Многослойный «Развернуть все» для расширителей?

#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 помощник. Спасибо!