MVVM - решение, какая ViewModel отвечает за что - PullRequest
2 голосов
/ 25 августа 2010

У меня есть простое приложение, которое состоит из:

Модель

  • Элементы
  • Критерии фильтра, примененные к этому списку элементов

Просмотры

  • WelcomePage
  • MainItemsPage
  • FilterEditPage

Яиспользуя MVVM Light и Windows Phone 7

В настоящее время у меня есть 3 модели представления, по одной для каждого просмотра.В прошлом у меня была единственная ViewModel, которая сделала общение, о котором я собираюсь спросить, очень простым.Однако я хотел использовать 3 отдельные виртуальные машины, так как это, кажется, правильный путь.

WelcomePage может установить один из критериев фильтра, прежде чем перейти к MainItemsPage.MainItemsPage связан со свойством Items, которое предоставляется его ViewModel.Эта ViewModel должна была отфильтровать этот список в зависимости от текущих критериев фильтрации.FilterEditPage позволяет пользователю редактировать полный набор критериев из 4 переменных.Когда критерии изменяются, коллекцию Items, используемую в ViewModel для MainItemsPage, необходимо повторно фильтровать.

Вопрос заключается в том, как передать поток изменений фильтра через приложение.Я знаю, что в MVVM есть концепция обмена сообщениями, а инструментарий MVVM Light предоставляет класс Messenger.Однако, с чем я борюсь, это где ответственность за отправку этих сообщений?

  1. 3 виртуальные машины идут в модель, когда им нужно работать с текущим набором фильтров?
  2. Все ли обновления фильтра проходят через FilterEditViewModel и что, в свою очередь, передает сообщение об изменении фильтра?
  3. Вернусь ли я к одной виртуальной машине для всех видов?

Я не вижу 1. работающего, потому что что-то должно будет заставить виртуальные машины вернуться к модели, которую я знаю.Я могу получить 3. работу прямо сейчас без проблем.Это так?

TIA

Пэт Лонг

Ответы [ 2 ]

0 голосов
/ 25 августа 2010

Я бы поместил фильтр общего тока в модель, а не в модель представления.У вас есть много моделей представления потенциально на разных страницах или на одной и той же странице (рассмотрите крошку, показывающую текущий выбор, и что-то еще, что должно показать фильтр, был применен).на какие модели просмотра можно подписаться?

0 голосов
/ 25 августа 2010

Три виртуальные машины - правильный путь в вашем сценарии.Я предлагаю вам построить отношения между родителями и детьми между вашими виртуальными машинами.Поскольку MainVM содержит ItemList, это место, где применяются FilterChanges.FilterEditVM только получает изменения фильтра и затем вызывает MainVM, что он должен повторно применить фильтры.

Структура будет выглядеть примерно так:

public class WelcomePageVM
{
    public WelcomePageVM()
    {
        this.FilterEditPageVM = new FilterEditPageVM(this);
        this.MainItemsVM = new MainItemsVM(this);
    }

    public FilterEditPageVM FilterEditPageVM { get; private set; }

    public MainItemsVM MainItemsVM { get; private set; }

    public void SetInitialFilter1(object filter)
    {
        // the initial filter
        this.FilterEditPageVM.Filter1Value = filter;
        this.MainItemsVM.ApplyFilters();
    }
}

public class FilterEditPageVM : ChildViewModelBase<WelcomePageVM>
{
    public FilterEditPageVM(WelcomePageVM parent)
        : base(parent) { }

    public object Filter1Value { get; set; }
    public object Filter2Value { get; set; }
    public object Filter3Value { get; set; }
    public object Filter4Value { get; set; }

    public void FinishFilterChange()
    {
        this.Parent.MainItemsVM.ApplyFilters();
    }
}

public class MainItemsVM : ChildViewModelBase<WelcomePageVM>
{
    public MainItemsVM(WelcomePageVM parent)
        : base(parent) { }

    public List<object> ItemList { get; set; }

    public void ApplyFilters()
    {
        // filter apply logic
    }
}

public abstract class ChildViewModelBase<T>
{
    T _parent;

    public ChildViewModelBase(T parent)
    {
        this._parent = parent;
    }

    public T Parent { get { return _parent; } }
}

Здесь вы можете получить доступ ко всем моделям просмотра, что нормально, потому что вы остаетесь на уровне "контроллера".

...