Как сделать так, чтобы цели сообщения были единственным получателем целевого сообщения? - PullRequest
1 голос
/ 21 сентября 2010

Первый раз постер.

Я использую MVVM-Light с Silverlight 4 и RIA Services.Это был опыт обучения!Но пока что работает прекрасно .Мне было интересно две вещи.Прямо сейчас я использую инфраструктуру Messenger для передачи объектов EntityObjects обратно в ViewModel.Например, мне нужно открыть модель представления с конкретным объектом «Курс».Поэтому я создаю экземпляр View, и View отправляет сообщение ViewModel с курсом.У меня есть пара вопросов.

Первый вопрос: это лучший способ сделать это?Я не хочу использовать Prism или Unity или что-то подобное, потому что у меня нет времени на их изучение.(Для меня это была большая ничья MVVM Light. Часть Light.) Но я не мог найти другого способа передачи параметров в VM Locator.

Вторая часть - это означает, что яотправляю сообщения из View в конкретную ViewModel этого View.Мои сообщения выглядят так:

  Tuple<Models.Course, Services.VWDS> courseDomainContextTuple = new Tuple<Models.Course, Services.VWDS>(Course, DomainContext);

  NotificationMessage<Tuple<Models.Course, Services.VWDS>> message = new NotificationMessage<Tuple<Models.Course, Services.VWDS>>(this, this.DataContext, courseDomainContextTuple, Models.MessageString.EditCourse);

  Messenger.Default.Send<NotificationMessage<Tuple<Models.Course, Services.VWDS>>>(message);  

Итак, как вы можете видеть, я связываю курс и DomainContext (Ах, RIA. Почему вы не позволите мне получить контекст из EntityObject?)и отправив их в ViewModel (это «this.DataContext») - и да, я знаю, что должен создать класс для этого сообщения.

Вот проблема - каждый объект, который получает курс и DomainContext, получает это сообщение, а не только виртуальная машина, которую я обозначил как цель.

Итак, второй вопрос: это дизайн, или это ошибка, или я что-то не так делаю?

Спасибо!

Ответы [ 2 ]

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

Чтобы ответить на ваш второй вопрос, если вы отправляете сообщение NotificationMessage определенного типа, все, кто регистрируется для этого же типа сообщения, получит сообщение. Если вы хотите ограничить число получателей сообщения, либо создайте новый класс сообщений, унаследованный от MessageBase или NotificationMessage, либо от чего-либо еще, отправьте ваше сообщение с Token или используйте в своем обработчике оператора оператор if для фильтрации. сообщения, которые вас не волнуют.

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

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

public partial class ExampleView : UserControl
{
    private IExampleViewModel ViewModel
    {
        get { return this.DataContext as IExampleViewModel; }
    }

    public ExampleView()
    {
        InitializeComponent();

        // Call directly to my View Model
        ViewModel.SomeMethod();

        // Register for View Model's event
        ViewModel.SomeEvent += ViewModel_SomeEvent;
    }

    private void ViewModel_SomeEvent(object sender, EventArgs e)
    {
        // do stuff
    }
}

Я также включил в пример, как я обрабатываю сообщения от ViewModel обратно к событиям сквозного просмотра.

...