Изменить выбранную вкладку из ViewModel и отправить объекты между ViewModel - PullRequest
2 голосов
/ 21 сентября 2011

Я получил настольное приложение wpf с 3 моделями просмотра. У меня есть 1 ViewModel, которая содержит вкладку и вкладки. И я получил 2 вкладки. Каждая из этих вкладок имеет свою собственную ViewModel.
У меня проблема в том, что в tab1 у меня есть список с результатами поиска и кнопка. Когда я выбираю один элемент в этом списке и нажимаю кнопку, я хочу изменить вкладку и отобразить информацию об этом элементе, который я выбрал в tab2.
Я искал решение, но, похоже, оно включает в себя создание всех ViewModel в MainViewModel и предоставление ссылки на MainViewModel на все subViewModel.
Нет ли другого пути?



EDIT

Мне удалось решить мои проблемы с MVVM light, который я добавил в проект.

Связав метод в MainViewModel и свойство в нем с .xaml, я могу теперь вызывать его из tab1 с информацией, чтобы сказать ему сменить tab. Кроме того, привязав метод в tab2, я теперь могу отправлять элемент из tab1 таким же образом.

Вот как я решил эту проблему после импорта MVVM light в проект.
В таб1

Messenger.Default.Send<string, tab2ViewModel>(--object to send to tab2--);
Messenger.Default.Send<int, MainViewModel>(--tab index--);

In Main / tab2

Messenger.Default.Register<int>(this, ChangeTab);
public void ChangeTab(int i)
{
   SelectedTabIndex = i; //Bound property in .xaml
}

Кажется, он просто автоматически работает ..

P.s. Спасибо за ответ. Я также расскажу о том, как работает Prism, и выясню, есть ли какие-либо преимущества в использовании этого вместо света MVVM (не сейчас, однако).

1 Ответ

1 голос
/ 21 сентября 2011

Хорошим решением вашей проблемы было бы использование EventAggregator of Prism.

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

Документацию можно найти здесь: EventAggregator Подробнее о Prism здесь: Prism на Codeplex


Вот конкретный образец.Представьте, что вы хотите изменить заголовок главного окна из любой точки приложения.Вы должны создать это событие:

public class TitleChangedEvent : CompositePresentationEvent<string>{}

Затем вы добавите это событие в свою MainWindowViewModel следующим образом:

eventAggregator.GetEvent<TitleChangedEvent.Suscribe(
(newTitle) =>
{
    this.WindowTitle = newTitle;
});

И, наконец, вы можете обновить заголовок из любого места в вашем приложении, например:это:

eventAggregator.GetEvent<TitleChangedEvent>().Publish("This is a new title!");

Довольно просто, как вы можете видеть.


С улыбкой с MVVM Light вы сначала создадите сообщение для уведомления:

public class TitleChangedMessage : GenericMessage<string>{}

Затемвы бы прослушали подобное сообщение в вашей MainWindowViewModel:

Messenger.Register<TitleChangedMessage>(this, 
(message) =>
{
    this.WindowTitle = message.Content;
}

и отправили бы обновление следующим образом:

Messenger.Send<TitleChangedMessage>(this, new TitleChangedMessage("This is a new title!"));

Это MVVM Light способ сделать это :)

Вы также можете взглянуть на этот связанный вопрос: Класс Messenger в MVVM Light

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