Многослойный «Expand All» для расширителей? - PullRequest
0 голосов
/ 08 ноября 2011

Я пишу интерфейс конфигурации MVVM и пытаюсь реализовать функцию развернуть / свернуть все, которая применяется ко всем представлениям.

ViewModel верхнего уровня - это однородная коллекция других ViewModel, которая связана с ItemsControl в представлении. Каждый из этих дочерних ViewModels имеет несколько зависимых ViewModels, каждый из которых связан с ContentControl в представлении. Визуально это принимает форму набора расширителей (скажем, 3 из них), каждый из которых имеет 4-6 расширителей, скрытых внутри.

Я пробовал нисходящие методы поиска. Поскольку расширители верхнего уровня свернуты, их дочерние расширители даже не существуют, пока они не будут показаны в первый раз (Caliburn.Micro делает для них местоположение просмотра, когда их впервые запрашивают), и "раскрывают все" действие только расширяет первый уровень.

Логическое дерево тоже не поможет. Свойство ItemsControl верхнего уровня Items на самом деле содержит объекты моего типа ViewModel, поэтому я не могу заглянуть в них для расширения.

Я думал об управлении этим на уровне ViewModel, но добавление свойства IsExpanded ко всем виртуальным машинам и установка его с помощью какого-либо глобального менеджера кажется грязной. У ВМ нет другой причины узнать, какие расширители расширены.

Какой лучший способ справиться с этим? Есть ли какой-нибудь трюк с привязкой привязанного свойства, который я мог бы использовать?

1 Ответ

1 голос
/ 08 ноября 2011

Ваша 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 () ссоответствующий параметр.

Это может сработать для вас ... подумайте.

...