Отправить пустое сообщение или уведомление с помощью MVVM toolkit light - PullRequest
2 голосов
/ 01 июня 2010

Я использую MVVM Light Toolkit. Мне не удалось найти Ctor of Messenger или класс уведомлений для отправки пустого сообщения.

ViewModel1:

 private int _selectedWeeklyRotation;
    public int SelectedWeeklyRotation
    {
        get { return _selectedWeeklyRotation; }
        set
        { 
            if(_selectedWeeklyRotation == value)
                return;

            _selectedWeeklyRotation = value;
            this.OnPropertyChanged("SelectedWeeklyRotation");
            if(value > 1)
                Messenger.Default.Send();                     
        }
    }

ViewModel2:

Ctor:

Messenger.Default.Register(this, CreateAnotherTimeTable); 

private void CreateAnotherTimeTable()
{

}

Мне просто нужно отправить уведомление другому ViewModel, вообще не отправлять данные.

Возможно ли это с библиотекой MVVM Light Toolkit?

Ответы [ 4 ]

2 голосов
/ 04 января 2011

Вы можете попробовать отправить простое сообщение со строковым тегом и получить это сообщение, сопоставив строковый тег. Примерно так:

Часть кода отправителя, расположенная, возможно, в чем-то вроде ViewModel1.cs

Messenger.Default.Send<string>("Dummy text message", "String_ToHelpMatchTheMsg");

Получение конечной части кода, отвечающего на это сообщение выше, возможно, находится в каком-то другом файле, что-то вроде ViewModel2.cs
...

Messenger.Default.Register<string>(this, "String_ToHelpMatchTheMsg", executeThisFunction);

private void executeThisFunction(string strMsg)
{
   //your code would go here to run upon receiving the message
   // The following line will display: "Dummy text message" 
   System.Windows.Browser.HtmlPage.Window.Alert("msg passed: " + strMsg); 
}

Обратите внимание, что вам не нужно ничего делать с текстовым сообщением, которое передается с кодом сообщения выше. Только одна часть кода отправляет некоторый ping другой части кода, чтобы попросить какой-то другой раздел выполнить некоторый код. Важной строкой является та, в которой я использовал «String_ToHelpMatchTheMsg», потому что это ключ, используемый для соответствия отправителя и получателя. Почти как при создании собственного квази-события, после запуска метода Send метод Register получает уведомление и запускает также свою собственную функцию.

Я использовал это с кнопкой «Закрыть» в дочернем окне, чтобы закрыть его. Кнопка «Закрыть» в представлении дочернего окна привязывается к команде реле в его childWindowViewModel. Эта команда ретрансляции имеет приведенный выше код для отправки сообщения в ParentViewModel. Часть Register в ParentViewModel отвечает на это сообщение, вызывая метод, закрывающий ChildWindow, который был первоначально создан из этого parentViewModel.

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

Все это, чтобы избежать размещения кода в коде, чтобы закрыть дочернее окно! :-) Используйте по своему усмотрению.

Приветствия. Mario

2 голосов
/ 31 декабря 2010

Если я что-то не так понимаю, разве вы не можете сделать это, создав и отправив пользовательский тип "сигнального сообщения" через Messenger?

public class WeeklyRotationSignal {}

Messenger.Default.Send(new WeeklyRotationSignal());

Затем зарегистрируйтесь в модели другого вида:

Messenger.Default.Register<WeeklyRotationSignal>(this, msg => doWork);
1 голос
/ 05 июня 2010

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

Если издательству ViewModel известен тип ViewModel, его попытка отправить на него может ...

Messenger.Default.Send<Type>(typeof(ViewModelToSendTo);

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

0 голосов
/ 02 июня 2010

Я не думаю, что это возможно, и, честно говоря, я не вижу смысла в получении такого рода сообщений. Вы также можете отправить строку «SelectedWeeklyRotation». Кажется странным иметь пустое сообщение, которое имеет какое-то значение по мере увеличения количества широковещательных сообщений и получателей в вашем приложении.

В используемой версии MVVM Light даже невозможно отправить пустое сообщение.

Однако я видел метод в ViewModelBase, который:

// Update bindings and broadcast change using GalaSoft.MvvmLight.Messenging
RaisePropertyChanged(MyPropertyPropertyName, oldValue, value, true);

Это может вас заинтересовать.

...