WPF: группировка живых данных

Модель:

Предположим, что у меня есть модель Book.

public class Book
{
    public string Author { get; set; }
    public string Title { get; set; }
    public string Genre { get; set; }
    public DateTime Published { get; set; }
}

Также у меня есть такой DataService. В нем есть события для обновления книг на стороне клиента:

public interface IBookService
{
    List<Book> GetAllBooks();

    // Book changed event.
    EventHandler<BookChangedEventArgs> BookChanged;

    // Book added/removed event.
    EventHandler<BooksCollectionChangedEventArgs> BooksCollectionChanged;
}

Клиент пользовательского интерфейса WPF (MVVM):

У меня класс BookViewModel (обертывает Book). У меня есть ObservableCollection<BookViewModel>, который синхронизирован с некоторой реализацией интерфейса IBookService.

Итак, вопрос. Необходимо разрешить пользователю выбирать одну из книг (не жанр и не автора) со следующим пользовательским интерфейсом:

Пользовательский интерфейс

Плоская коллекция BookViewModel должна быть как-то "сгруппирована" последовательно (или я не знаю, как это правильно назвать):

  1. Жанры.
  2. Авторы (выбранного жанра).
  3. Книги (выбранного жанра и выбранного автора).

Таким образом, каждый уровень является мастером для своего уровня-потомка.

Также вы можете упомянуть кнопки «Назад/Далее». Они должны перемещаться по уровню книг (последнему). Например, если выбрана последняя книга и вы нажимаете «Далее» (см. изображение), следующее состояние Интерфейс должен быть: Второй жанр => Второй автор => Какая-то книга (второго жанра и второго автора).

Как добиться такого сложного пользовательского интерфейса: многоуровневая группировка? Как проще всего реализовать такой браузер книг? Я был бы признателен, если бы вы могли предоставить мне подобный пример.


person Sergey Vyacheslavovich Brunov    schedule 03.07.2012    source источник


Ответы (1)


Он Серж,

Я бы просто использовал один SelectBookViewModel, который реализует ваш IBookService. Эта ViewModel содержит Collection<Book> или ObservableCollection<Book>. Каждый раз, когда вы получаете событие UpdateEvent, которое обновляет вашу коллекцию книг, вы выполняете запрос LINQ к этой коллекции, чтобы получить список таких жанров, как:

GenreListProperty = (from book in books
                     select book.Genre).Distinct().ToList();

Привяжите свой первый ListView к этому GenreListProperty. Реализуйте некоторую другую логику для запроса списков для других ListViews в том же стиле в зависимости от событий изменения свойства SelectedItem первого списка.

Кнопки просто выполняют некоторую навигацию по ListViews и их логике обновления при SelectedItem изменениях. При нажатии кнопки «ОК» вы просто выполняете комбинированный запрос LINQ в коллекции книг, чтобы выбрать выбранную, с которой продолжается ваша обработка.

person Batuu    schedule 03.07.2012