Silverlight ItemsControl, отображающий один элемент за раз? - PullRequest
1 голос
/ 19 июля 2011

Я ищу хороший способ отображать один элемент из коллекции за один раз в Silverlight, не показывая пользовательский интерфейс для выбора элемента. Это будет похоже на TabControl без вкладок или комбинированный список без раскрывающегося списка.

Сейчас мы используем стиль TabControl, чтобы скрыть вкладки, но это похоже на хак. Есть ли более естественный способ сделать это в Silverlight?

Вот функции, которые я ищу:

  • Показывать только выбранный элемент.
  • Не отображать пользовательский интерфейс для выбора элемента. (Выбор будет изменен в зависимости от действий пользователя в другой части пользовательского интерфейса приложения.)
  • Привязка данных к коллекции моделей представления.
  • Использование DataTemplate для отображения представления для каждой модели представления.
  • Сохранение состояния просмотра для каждого выбранного элемента. (Например, предположим, что внутри нашего элемента управления по одному элементу времени мы отображаем дерево параметров для выбранного элемента. Я бы хотел, чтобы развернутое / свернутое состояние узлов дерева отслеживалось отдельно для каждого элемента .)

Я пытался просто использовать ContentPresenter, привязанный к выбранному элементу:

<ContentPresenter Content="{Binding SelectedItem}">
  <ContentPresenter.ContentTemplate>
    <DataTemplate>
      <MyUserControl />
    </DataTemplate>
  </ContentPresenter.ContentTemplate>
</ContentPresenter>

Но, похоже, для этого используется один экземпляр MyUserControl, связывающий один и тот же экземпляр с различными моделями представления при изменении SelectedItem. Это означает, что состояние, например, развернуты или нет узлы дерева, не отслеживается отдельно для выбранного элемента.


Есть ли лучший способ сделать это?

Спасибо за вашу помощь,
Ричард

Ответы [ 3 ]

2 голосов
/ 19 июля 2011

Лучший способ сделать это требует немного работы:

вы создаете класс, который расширяет System.Windows.Controls.Primitives.Selector, который является базовым классом для объектов, которые имеют:

  • Коллекция, привязанная к
  • selectedItem

Вы устанавливаете Grid как ItemsPanel и ItemTemplate DataTemplate, который заполняет всю сетку, но по умолчанию скрыт (или не имеет прозрачности)).Триггер в DataTemplate свойства IsSelected скрывает / показывает элемент.

Только одна возможность

1 голос
/ 19 июля 2011

Это довольно просто сделать.

Первым шагом является использование ListBox, предоставление таблицы данных, коллекции Viewmodel и привязка выбранного элемента, как вы уже делаете.

Необходимый шаг (скрытие всех невыбранных элементов) просто требует, чтобы вы создали ItemContainerStyle. Этот стиль имеет группу VisualStateGroup, на которую вы хотите обратить внимание, с двумя состояниями «Выбрано» и «Не выбрано». В невыбранном состоянии вы хотите, чтобы LayoutRoot был свернут, а в Selected вы хотите, чтобы LayoutRoot был видимым.

Если у вас есть смесь, это займет у вас около 15 минут.

1 голос
/ 19 июля 2011

Есть ли причина, по которой у вас должен быть доступ к свойству SelectedItem на самом элементе управления?Если вы можете переместить логику обработки выбранного элемента (например, отмена выбора, возврат того, какой элемент выбран и т. Д.) В модель представления, вы можете просто использовать ItemsControl с Grid в качестве ItemsPanel.Затем в ItemTemplate вы можете поместить MyUserControl.MyUserControl будет иметь свое свойство Visibility, привязанное к свойству элемента данных с конвертером между ними.Затем вы установите IsSelected в значение true для элемента данных вместо элемента управления UI, и будет показан соответствующий экземпляр MyUserControl.

...