Есть классическое MVVM приложение VIEW содержит textbox, где Text="{Binding Message}"
во ViewModel
private string _message { get; set; }
public string Message
{
get { return _message; }
set { _message = value; OnPropertyChanged("Message"); }
}
Как передавать это значение из других классов? Если у меня есть структура типа:
И сообщение надо передать из класса CalssC, ClassG, ClassH
Я делал через event
типа
allModel.textAllModel += AllModel_TextChanged;
private void AllModel_TextChanged(object sender, TextMessage e)
{
Message = e.message;
}
Но если у меня допустим 9 классов из которых надо передавать это сообщение, это надо каждый класс подписать на event
и в нем объявить event
.
В ClassA event на который будет подписан ModellAll, в ClassB event на который будет подписан CalssA, в ClassC event на который будет подписан CalssB и т.д.
И вот тут у меня вкрались подозрения что я делаю что то не так. Как нормальные люди обходят такие ситуации?
Напишите простой класс, который будет выступать посредником между отправителями и получателями сообщений, для начала можно его даже сделать статическим:
static class Logger
{
public static event Action<string> MessageReceived;
public static void SendMessage(string msg)
=> MessageReceived?.Invoke(msg);
}
Теперь все, кому нужно что-то сообщить, просто вызывают метод SendMessage()
:
Logger.SendMessage("Сообщение");
В конструкторе своей VM подпишитесь на событие MessageReceived
:
Logger.MessageReceived += OnMessageReceived;
и обновите свойство:
void OnMessageReceived(string msg)
{
if (!Application.Current.Dispatcher.CheckAccess())
Application.Current.Dispatcher.InvokeAsync(() => Message = msg);
else
Message = msg;
}
Обратите внимание на использование Dispatcher - он позволяет обновлять свойства VM в потоке GUI (иначе будет возникать исключение - связанный вопрос).
Этот способ удобен еще и тем, что если вы захотите, например, параллельно писать все сообщения в файл - это не потребует глобальных изменений, достаточно будет просто подписать еще одно заинтересованное лицо на событие MessageReceived
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Имеется паттерн /d/d:/d/d:/d/d для времениМетоды Regex
Возникла проблема с выполнением блокировки пользователей на сайтеА именно, нет понимания как сделать автоматическое открытие страницы...