MVVM - навигация между представлениями - PullRequest
1 голос
/ 02 апреля 2011

У меня есть ListBox, связанный с ViewModel, который предоставляет параметр типа ObservableCollection. Я настроил ICommand, который запускается при выборе одной из строк в ListBox. (используя метод 3 в этом посте - кстати, он прекрасно работает).

Теперь мой вопрос (который не имеет ничего общего с методом 3, описанным выше, или ListBox), когда моя ICommand запущена, и я хочу перейти на другую страницу (например, страницу с подробностями), где находится логика хранится (или как мне это сделать?).

Причина, по которой я спрашиваю, состоит в том, что я не уверен, как настроить метод команды в классе ViewModel так, чтобы он оставался тестируемым.

ps: я использую Prism, и мне было интересно, предоставляет ли он какие-либо классы / шаблоны для навигации.

Ответы [ 2 ]

6 голосов
/ 02 апреля 2011

Просто для подробного описания использования IEventAggregator - он дает вам простую модель Pub / Sub для отправки произвольных сообщений между отделенными (т.е. ни одна из них не должна ничего знать о других) частях приложения.Таким образом, мы можем получить ссылку на IEventAggregator в нашем конструкторе ViewModel (это автоматически разрешается для вас платформой), то есть:

private IEventAggregator eventAggregator;

public PublisherViewModel(IEventAggregator eventAggregator)
{
    this.eventAggregator = eventAggregator;

Затем в нашем измененном обработчике выбора мы можем опубликовать событие:

var changedEvt = eventAggregator.GetEvent<MyListboxChangedEvent>();
changedEvt.Publish(selectedItemId);

Это зависит от нашего пользовательского класса событий MyListboxChangedEvent:

public class MyListboxChangedEvent : CompositePresentationEvent<int> {}

Итак, наконец, во ViewModel, который отвечает на это действие, мы настроили подписку на событие,и соответствующий метод-обработчик:

public SubscriberViewModel(IEventAggregator eventAggregator)
{
    var changedEvt = eventAggregator.GetEvent<MyListboxChangedEvent>();
    changedEvt.Subscribe(OnListBoxChanged, ThreadOption.UIThread);
}

public void OnListBoxChanged(int selectionId)
{
    // do whatever we need
}

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

3 голосов
/ 02 апреля 2011

Рассматривали ли вы использование EventAggregator для отправки сообщения, которое вы хотите показать в другом представлении.Приложение StockTrader, включенное в дистрибутив PRISM, послужит хорошим примером использования.

...