Решение, которое может быть даже проще, чем у Рида Копси: вместо того, чтобы возиться с привязками ListView
, создайте три разных ListView
, и пусть кнопки определяют, какая из них видна. Сделал бы я это так или как Рид, зависит в первую очередь от вещей, о которых вы нам еще не рассказали.
Изменить:
Чтобы ответить на ваш вопрос, мы собираемся выйти за пределы «еще более простой» территории и перейти к теме «почему WPF чертовски крут».
Фактически, более WPFish, MVVMish способ сделать что-то - создать подкласс для каждого из ваших трех типов коллекций - например. тип с именем CharactersCollection
, который является подклассом ObservableCollection<Character>
. Затем добавьте DataTemplate
для каждого из этих типов в словарь ресурсов:
<DataTemplate DataType="CharactersCollection">
<ListView ItemsSource="{Binding}">
<!-- specific column definitions for character information goes here -->
</ListView>
</DataTemplate>
Теперь каждый раз, когда в WPF требуется визуализировать CharactersCollection
, он находит этот шаблон и использует его.
В классе модели представления вы можете создать такое свойство:
private object _ActiveCollection;
public object ActiveCollection
{
get { return _ActiveCollection; }
set
{
_ActiveCollection = value;
OnPropertyChanged("ActiveCollection");
}
}
Достаточно просто, не так ли? Какая коллекция активна? Как только вы это сделаете, все, что должно представлять свойство ActiveCollection
, например:
<ContentControl Content="{Binding ActiveCollection}"/>
отобразит активную коллекцию, используя DataTemplate
, соответствующий типу активной коллекции.
А так как вы реализовали INotifyPropertyChanged
, каждый раз, когда вы устанавливаете ActiveCollection
, его текущее значение будет отображаться с использованием соответствующего шаблона. Итак, теперь все, что нужно сделать вашим кнопкам, — это установить свойство объекта, который является источником привязок. (Или быть привязанным к Command
объектам, которые делают это, но давайте пройдемся, прежде чем бежать.)
person
Robert Rossney
schedule
24.03.2010