Отправить объект в VIewModel с помощью mvvm-light - PullRequest
0 голосов
/ 20 января 2012

Я довольно новичок в мире света MVVM, и после поисков я не могу найти то, что хочу сделать.

Мое приложение WP7 содержит сводку, каждое содержимое элемента сводки - View1, а viewmodel - VM1..

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

пример:

PivotItem 1 -> отправить параметр "car" в модель представления PivotItem 2 -> отправить параметр "truck" в модель представления и т. д.

Google сказал мне использовать обмен сообщениями, но если я отправлю 2 сообщения из моей MainViewModel, обе PivotItem1и PivotItem2 ViewModel получит эти сообщения.

Я ошибаюсь при таком подходе?Есть ли другое решение для достижения успеха?

Заранее спасибо за ваш ответ.

PS: будьте снисходительны, английский не мой родной язык, не стесняйтесь спрашивать дополнительную информацию.

С уважением,

Aymeric Lagier

Ответы [ 3 ]

0 голосов
/ 22 января 2012

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

    public void RegisterForAppMessage(AppMessages.MessageTypes messageType)
    {
        switch (messageType)
        {
            case AppMessages.MessageTypes.PivotViewItem1Message:
                 AppMessages.PivotViewItem1Message.Register(this,DoSomethingWhenIRecievePivotViewItem1Messages)
            break;
            case AppMessages.MessageTypes.PivotViewItem2Message:
                 AppMessages.PivotViewItem2Message.Register(this,DoSomethingWhenIRecievePivotViewItem2Messages)
            break;
        }
    }

    private void DoSomethingWhenIRecievePivotViewItem2Messages(string obj)
    {
        // TODO: Implement this method
        throw new NotImplementedException();
    }

    private void DoSomethingWhenIRecievePivotViewItem1Messages(string obj)
    {
        // TODO: Implement this method
        throw new NotImplementedException();
    }
0 голосов
/ 20 апреля 2016

Сообщения звучат немного тяжело для этой цели. Не могли бы вы просто ввести параметр в вашу ViewModel. Если у вас уже есть MVVMLight, у вас также есть поддержка SimpleIOC. Может быть, позволить представлению определить местонахождение своей модели представления, когда представление разрешено, и решить, какой параметр использовать в модели представления? Вы можете увидеть пример этого здесь

0 голосов
/ 21 января 2012

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

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

namespace MyProject.Common
{
    public static class AppMessages
    {
        enum MessageTypes
        {
             ViewmodelA,
             ViewmodelB
        }

        public static class ViewModelAUpdate
        {
            public static void Send(string value)
            {
                 Messenger.Default.Send(value, MessageTypes.ViewmodelA);
            }

            public static void Register(object recipient, Action<string> action)
            {
                Messenger.Default.Register(recipient, MessageTypes.ViewmodelA, action);
            }
        }

        public static class ViewModelBUpdate
        {
            public static void Send(string value)
            {
                Messenger.Default.Send(value, MessageTypes.ViewmodelB);
            }

            public static void Register(object recipient, Action<string> action)
            {
                Messenger.Default.Register(recipient, MessageTypes.ViewmodelB, action);
            }
        }
    }
}
...