WPF Listview - Как лучше всего отображать данные из различных ObservableCollections на основе нажатия кнопки? - PullRequest
2 голосов
/ 24 марта 2010

У меня есть три ObservableCollections: CharacterCollection, LocationCollection и ItemCollection. Они все коллекции предметов; CharacterCollection - это коллекция объектов персонажей. Мне нужно отобразить в виде списка информацию из коллекции, определенной пользователем, нажав на кнопку. Я бы предпочел использовать привязку данных, но я не вижу четкого способа сделать это с несколькими коллекциями, содержащими разные типы объектов. Как лучше всего переключаться между коллекциями?

- Edit -

Одна из основных проблем, с которыми я сталкиваюсь, заключается в том, что для разных коллекций требуется разное количество строк и разные заголовки строк.

Ответы [ 3 ]

2 голосов
/ 24 марта 2010

Просто используйте одно свойство IList в вашей ViewModel (или коде позади), например:

private IList currentCollection;
public IList CurrentCollection
{
   get { return this.currentCollection; }
   set
   {
       if (this.currentCollection != value)
       {
           this.currentCollection = value;
           var handler = this.PropertyChanged;
           if (handler != null)
               handler(this, new PropertyChangedEventArgs("CurrentCollection");
       }
   }

Как только вы это сделаете, когда вы захотите переключить какую коллекцию для просмотра, просто установите CurrentCollection = ItemCollection;. Шаблоны данных, используемые ListView, могут обрабатывать различные типы объектов без проблем.

1 голос
/ 24 марта 2010

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

0 голосов
/ 24 марта 2010

WPF CompositeCollection будет обрабатывать коллекции, содержащие объекты любого типа, а также является наблюдаемым.

Другой вариант, который более строго типизирован, заключается в наследовании от общего базового предложения для всех коллекций, с которыми вы хотите связать. Затем вы можете создать универсальную собственность ObservableCollection для привязки в форме ObservableCollection.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...