2010-08-25 4 views
2

У меня есть простое приложение, которое состоит из:MVVM - Решение, которое ViewModel несет ответственность за то, что

Модель

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

Просмотров

  • WelcomePage
  • MainItemsPage
  • FilterEditPage

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

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

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

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

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

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

ТИА

Pat Long

ответ

0

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

Как насчет модели одноэлементного фильтра для фильтра, на который могут быть подписаны модели?

0

Три виртуальных машин это правильный путь в вашем сценарии. Я предлагаю вам установить связь между родителями и детьми между вами. Поскольку 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; } } 
} 

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

+0

P.S: Добавлено FinishFilterChange() to FilterEditVM – JanW

+0

Спасибо. Я могу видеть все, что работает, но кажется неправильным, что маленькая старая WelcomePage - это Родитель, но я думаю, что это связано с некоторым недоразумением и неправильным применением семантики. Вы положили WelcomePage в качестве родителя, потому что это первый экран (просмотр) загружен? –

+0

Точно. Конечно, с приведенной выше схемой вы можете свободно выбирать свой корень. Но я рекомендую использовать первый вид в качестве вашего корня, потому что его смысл, если ваша модель контроллера представляет собой способ, которым вы можете следовать в графическом интерфейсе. Если вы просмотрите свое приложение через некоторое время, вам будет легче понять рабочий процесс. Если вам не нравится ваша приветственная страница с правами root, я предлагаю вам создать еще один настоящий RootView, в котором вы переключите три других вида. В этом конкретном RootView будут представлены все три модели ViewModels. – JanW

Смежные вопросы