Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376

MVVM Light, как посредством Messaging передать данные из свойства (int) одной VM в свойство другой?

15.10.2021, 14:34. Показов 3200. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем,
в принципе все сказано в заголовке.
Может кто-нибудь выложить пример?

События передаю так из code behind в VM

Code behind

C#
1
2
3
4
5
6
7
8
9
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
 
           
            // Messaging           
            Messenger.Default.Send<NotificationMessage>(new NotificationMessage("Data updated while MainWindow loading"));
 
 
        }

VM

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 public void NotifyMe(NotificationMessage notificationMessage)
        {
 
 
            switch (notificationMessage.Notification)
            {
 
                case "Data updated while MainWindow loading": // подымаем методы  во время загрузки главного окна программы
 
                    DoSmth(); // чего-нибудь делаем
                   
 
                    break;
             }
        }
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.10.2021, 14:34
Ответы с готовыми решениями:

Кто-нибудь шарит в messaging MVVM Light? Есть кое-что непонятное
Здравствуйте, кто-нибудь может помочь с задачкой по messaging. Задачка не совсем простая.

MVVM Light. Как передать несколько параметров в команду?
&lt;Button x:Name=&quot;addEmployeeButton&quot; Height=&quot;23&quot; Margin=&quot;4,0,0,0&quot; Command=&quot;{Binding AddEmployeeCommand}&quot; CommandParameter=&quot;{Binding...

MVVM Light. Не биндится свойство вьюМодели к ListView.ItemsSource
&lt;UserControl x:Class=&quot;YourAssistant.View.MainView&quot; xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot; ...

32
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376
15.10.2021, 22:38  [ТС]
Студворк — интернет-сервис помощи студентам
Я про яблоки вы мне про груши. ибо это капец.

В первом посте писал же, что работаю с MVVM light, что свойство типа int.
0
 Аватар для Midian
609 / 391 / 198
Регистрация: 31.03.2013
Сообщений: 2,701
15.10.2021, 22:43
Цитата Сообщение от Berendom Посмотреть сообщение
В первом посте писал же, что работаю с MVVM light, что свойство типа int.
ну так поменяйте на int, в чем проблема? light работает также как и microsoft, принцип тот же, разберетесь, в общем я спать
0
28 / 16 / 2
Регистрация: 09.05.2020
Сообщений: 149
15.10.2021, 22:49
Люди, как это будет в mvvm light выглядеть? Для курсовой надо. У нас весь паттерн MVVM на light изучается.
Тип свойства поправим, не проблема.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
15.10.2021, 23:17
Цитата Сообщение от Berendom Посмотреть сообщение
мне - нет.

Не по теме:


ужассс...
Оно вам надо это wpf?



Цитата Сообщение от Berendom Посмотреть сообщение
У меня есть VM, скажем А. В ней свойство, скажем, типа int. Когда это свойство получает значение, скажем 1024, я хотел бы чтобы свойство в VM, cкажем B, тоже получило это 1024 в свое соответствующее свойство из VM1.
Не знаю какую реализацию INPC вы используете, пишу код исходя из Базовый класс для ViewModel - BaseInpc.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class VM : BaseInpc
{
    private int _a;
    public int A
    {
        get => _a;
        set
        {
            if(Set(ref _a, value))
           {
               Messenger.Default.Send<int>(value);
            }
 
           }
        }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class VM1 : BaseInpc
{
    private int _b;
    public int B
    {
        get => _b;
        set => Set(ref _b, value); }
    }
    private void SetB(int b) => B= b;
 
    public  VM1() => Messenger.Default.Register<int>
    (
        this,
        SetB
    );
}
Добавлено через 1 минуту
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Не знаю какую реализацию INPC
Затупил.
Понятно же что MVVMLight

Добавлено через 5 минут
В моём коде надо только поменять базовый класс VM на ViewModelBase из MVVMLight
0
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376
16.10.2021, 10:19  [ТС]
Элд Хасп,

по VM1

C#
1
2
3
4
5
6
7
    private int _b;
    public int B
    {
        get => _b;
        set => Set(ref _b, value); }
    }
    private void SetB(int b) => B= b;
Это свойство? Спрашиваю потому что, как я его не крутил - выдает ошибку.


C#
1
2
3
4
5
6
        public int IntegerValue
        {
            get { return _integerValue; }
            set { Set(ref _integerValue, value); }
        }
        private int _integerValue;
У нас свойства такие,




C#
1
2
3
4
5
public  VM1() => Messenger.Default.Register<int>
    (
        this,
        SetB
    );

Это конструктор VM? Можно без модных стрелок?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
16.10.2021, 14:07
Цитата Сообщение от Berendom Посмотреть сообщение
Это свойство? Спрашиваю потому что, как я его не крутил - выдает ошибку.
Да свойство.
писал здесь, в редакторе сообщений - лишняя фигурная скобка в конце строки с Set(...).

Цитата Сообщение от Berendom Посмотреть сообщение
Это конструктор VM? Можно без модных стрелок?
Блин!
Berendom, у вас, вообще знаний по Шарпу нет?
Вам не рано WPF изучать?
Новомодными они были лет десять назад, наверное.

C#
1
2
3
4
5
6
7
8
public  VM1()
{
    Messenger.Default.Register<int>
    (
        this,
        SetB
    );
}
Добавлено через 1 час 44 минуты
Berendom, насколько помню в методе Set из MvvmLight есть ещё параметр Broadcast.
Если ему установbть trut, то будут автоматически отправлять сообщения типа PropertyChangedMessage.
Надо будет только отлавливать их.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
16.10.2021, 16:59
Лучший ответ Сообщение было отмечено Berendom как решение

Решение

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Berendom, насколько помню в методе Set из MvvmLight есть ещё параметр Broadcast.
Да. Так и есть.
Сделал демо-проект с передачей значений четырёх свойств.
Код VM'ей из него:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using GalaSoft.MvvmLight;
 
namespace PassingBetweenViewModel
{
    public class FirstViewModel : ViewModelBase
    {
        private int _number;
        private string _text;
        private int _number1;
        private string _text1;
 
        public int Number { get => _number; set => Set(ref _number, value, true); }
        public string Text { get => _text; set => Set(ref _text, value, true); }
        public int Number1 { get => _number1; set => Set(ref _number1, value, true); }
        public string Text1 { get => _text1; set => Set(ref _text1, value, true); }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Messaging;
 
namespace PassingBetweenViewModel
{
    public class SecondViewModel : ViewModelBase
    {
        private int _value;
        private string _content;
        private int _value1;
        private string _content1;
 
        public int Value { get => _value; private set => Set(ref _value, value); }
        public string Content { get => _content; private set => Set(ref _content, value); }
        public int Value1 { get => _value1; private set => Set(ref _value1, value); }
        public string Content1 { get => _content1; private set => Set(ref _content1, value); }
 
        private void SetNumber(PropertyChangedMessage<int> message)
        {
            if (message.PropertyName == nameof(FirstViewModel.Number))
                Value = message.NewValue;
            else if (message.PropertyName == nameof(FirstViewModel.Number1))
                Value1 = message.NewValue;
        }
        private void SetText(PropertyChangedMessage<string> message)
        {
            if (message.PropertyName == nameof(FirstViewModel.Text))
                Content = message.NewValue;
            else if (message.PropertyName == nameof(FirstViewModel.Text1))
                Content1 = message.NewValue;
        }
 
        public SecondViewModel()
        {
            MessengerInstance.Register<PropertyChangedMessage<int>>(this, SetNumber);
            MessengerInstance.Register<PropertyChangedMessage<string>>(this, SetText);
        }
    }
}
Архив со всеми исходниками: PassingBetweenViewModel.7z
2
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376
16.10.2021, 21:33  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Архив со всеми исходниками:
Я где-то не догоняю. В вашем проекте все прекрасно.

Загнал тоже самое в курсовую, ошибок нет, но во второй VM нули и все. MVVM light гениальнейшая и прозрачнейшая вещь, конечно после объяснений Элд Хаспа.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
16.10.2021, 21:36
Цитата Сообщение от Berendom Посмотреть сообщение
Загнал тоже самое в курсовую, ошибок нет, но во второй VM нули и все
Может с регистрацией напутали, может с экземплярами VM.
На Гит скиньте - я посмотрю.
0
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376
16.10.2021, 22:06  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Может с регистрацией напутали, может с экземплярами VM.
у вас регистрация только в VM2(получатель).

В VM1 только свойства. Почему нет

C#
1
Messenger.Default.Send<>
Интересно как тогда "вздрагивают" SetNumber, SetText?

Да еще у меня вот это:

C#
1
 Messenger.Default.Register<NotificationMessage>(this, NotifyMe);
Может это мешает?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
16.10.2021, 22:21
Цитата Сообщение от Berendom Посмотреть сообщение
у вас регистрация только в VM2(получатель).
Регистрируются только методы получателя.
Это очень близко в подписке на событие.
Чтобы прослушать событие надо подписать на него метод.
Но поднять событие (передать сообщение) можно откуда угодно без всякой подписки (регистрации).


Цитата Сообщение от Berendom Посмотреть сообщение
В VM1 только свойства. Почему нет
Это встроено в реализацию метода Set в ViewModelBase.
Последний параметр в Set - true.
Он означает передачу сообщения.
То есть метод MessengerInstance.Send<> вызывается.
Но вызываем его не мы явно, а сам метод Set.

Цитата Сообщение от Berendom Посмотреть сообщение
Да еще у меня вот это:
C#
1
 Messenger.Default.Register<NotificationMessage>(this, NotifyMe);
Может это мешает?
Я же вам дал архив с исходниками.
Поменяйте в нём и проверьте.

Я не использую MvvmLight? поэтому без проверки точно тоже не могу сказать.
Но исходя из общего опыта и знания ООП, думаю, разницы не будет.

Добавлено через 3 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Да еще у меня вот это:
СТОП!

А какой тип сообщения в зарегистрировали?
Регистрация и потом вызов методов происходит именно по типу сообщения.
Посмотрите у меня зарегистрированы два типа сообщения PropertyChangedMessage<int> и PropertyChangedMessage<string>.
Именно сообщения типа PropertyChangedMessage<T> отправляются из метода Set.
И тип сообщения соответствует типу изменяемого свойства.

А в вашем вопросе тип NotificationMessage.
Сообщения такого типа никто не отправляет.
0
28 / 16 / 2
Регистрация: 09.05.2020
Сообщений: 149
16.10.2021, 22:30
Цитата Сообщение от Элд Хасп Посмотреть сообщение
То есть метод MessengerInstance.Send<> вызывается.
Но вызываем его не мы явно, а сам метод Set.
Berendom, Берендомыч ты гений (третий по счету) после Laurent Bugnion и Элд Хаспа, потому что правильные вопросы задаешь.

В передающей VM то Send нет. И ты правильно это засек. А мы то используем свои свойства и true в них нет.

У меня пошло!

Добавлено через 36 секунд
Элд Хасп, поклон.
1
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376
16.10.2021, 22:46  [ТС]
Цитата Сообщение от Nguen Посмотреть сообщение
А мы то используем свои свойства и true в них нет.
А я последнюю извилину поломал, как у Элд Хасп, без Send в VM1(трансляция) работает. А оно вон чего...

Тоже запустил. Все ОК.

Элд Хасп, огромное спасибо! Выручили! Впрочем как всегда.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.10.2021, 22:46

Зачем в MVVM Light в классе ViewModelLocator статичные свойства указывающие на ВьюМодели?
public class ViewModelLocator { private static MainViewModel _main; /// &lt;summary&gt; /// Initializes a...

Как передать данные с одной формы на страницу с другой формой?
Есть страница с формой заказа там есть номер телефона, как передать номер телефона на страницу с другой формой?

Как передать данные из одной dgv одной формы в dgv другой?
Проблема номер 2 Моя программа работает с базой данных, записывает, удаляет и считывает данные из 2 таблиц. В дочерной форме номер 1...

Доступ к свойствам из другой ViewModel [MVVM Light]
Здравствуйте! Как получить доступ к свойствам одной ViewModel из другой ViewModel? Использую MVVM Light. Долго гуглил, нашел, что нужно...

Открыть новое окно, используя MVVM Light и передать в него параметры
Как можно открыть новое окно используя MVVM Light и как туда передать параметры


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru