MVVM странное поведение мессенджера
Я пытаюсь передать пользователя между двумя моделями просмотра. Для этого я использую фреймворк MVVM light Messenger. Несмотря на то, что точка останова находится там, где я пытаюсь воздействовать на модель, которая передается во вторую ViewModel, некоторые текстовые блоки, привязанные к свойствам, не обновляются.
Что я уже пробовал:
Вот как я передаю "пользователя", когда кто-то нажимает кнопку входа в систему:
#region Login private DelegateCommand _loginCommand; public ICommand LoginCommand { get { _loginCommand = new DelegateCommand(param => Login()); return _loginCommand; } } private async void Login() { var waitWindow = new PleaseWaitWindow(); waitWindow.Show(); if (await LoginCheck()) { // TODO: Navigate to the DashboardView Messenger.Default.Send(new ChangePage(typeof(DashboardViewModel))); Messenger.Default.Send(_chosenUser); } waitWindow.Close(); } #endregion
Вот как я подписываюсь на это сообщение и использую его содержимое:
public DashboardViewModel() { Messenger.Default.Register<User>(this, OnUserReceived); Messenger.Default.Register<ChangePage>(this, ChangePage); // Register to Messenger to change Views hosted in ContentControl } private void OnUserReceived(User user) { FirstName = user.FirstName; // Breakpoint is hit here with correct value LastName = user.LastName; }
И два текстовых блока, которые привязаны к свойствам FirstName и LastName..:
<StackPanel VerticalAlignment="Center" Margin="5"> <TextBlock Text="{Binding FirstName}" Foreground="White" Margin="5" FontSize="18"/> <TextBlock Text="{Binding LastName}" Foreground="White" FontWeight="Bold" Margin="5" FontSize="20"/> </StackPanel>
Если я установлю точку останова, где я действую на мессенджер, то FirstName и LastName будут установлены в правильные значения. Однако текстовые блоки не обновляются,и их текст остается пустым.
Я реализовал кнопку test в DashboardView, которая просто устанавливает FirstName = "Test"; и это действительно обновляет текстовый блок, чтобы сказать текст, поэтому я не понимаю, почему передача типа пользователя и использование его имени и фамилии не работает.
РЕДАКТИРОВАТЬ:
private void OnUserReceived(User user) { Application.Current.Dispatcher.Invoke(() => { FirstName = user.FirstName; LastName = user.LastName; }); }