Решение, которое может быть даже проще, чем решение Рида Копси: вместо того, чтобы возиться с привязками ListView
с, создайте три разных ListView
с, и пусть кнопки определяют, какая из них видима. Буду ли я делать это таким образом или путь Рида зависит, прежде всего, от того, о чем вы нам еще не сказали.
Edit:
Чтобы ответить на ваш вопрос, мы собираемся выбраться из "еще более простой" территории и в территорию "почему 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
объектами, которые делают это, но давайте пройдемся, прежде чем бежать.)