У меня есть приложение UWP с MvvmLight. На странице создания я открываю диалог содержимого, чтобы выбрать категорию и отправить ее через мессенджер MvvmLight на главную ViewModel.
Подписка на сообщение делается здесь:
public void Subscribe()
{
MessengerInstance.Register<CategorySelectedMessage>(this, async message => await ReceiveMessageAsync(message));
}
public void Unsubscribe()
{
MessengerInstance.Unregister<CategorySelectedMessage>(this, async message => await ReceiveMessageAsync(message));
}
private async Task ReceiveMessageAsync(CategorySelectedMessage message)
{
if(SelectedPayment == null || message == null)
return;
SelectedPayment.Category = mapper.Map<CategoryViewModel>(await mediator.Send(new GetCategoryByIdQuery(message.CategoryId)));
}
Свойство категории:
private CategoryViewModel? categoryViewModel;
public CategoryViewModel? Category
{
get => categoryViewModel;
set
{
if(categoryViewModel == value)
return;
categoryViewModel = value;
RaisePropertyChanged();
}
}
Сообщение отправлено сюда:
MessengerInstance.Send(new CategorySelectedMessage(category.Id));
и это сообщение:
public class CategorySelectedMessage
{
public CategorySelectedMessage(int categoryId)
{
CategoryId = categoryId;
}
public int CategoryId { get; set; }
}
Как только вызывается RaisePropertyChanged, набор вызывается снова дважды, но с нулевым значением. Метод ReceiveMessageAsync вызывается только один раз, поэтому я немного запутался, откуда поступают эти дополнительные вызовы. Если я закомментирую RaisePropertyChanged, дубликатов вызовов больше не будет, но, очевидно, пользовательский интерфейс не обновится. Я также проверил стек вызовов и не вижу повторяющихся вызовов.
Если это поможет, весь проект находится на Github по адресу: https://github.com/NPadrutt/MoneyFox.Windows/tree/fix-crashes
Процесс заключается в добавлении платежа и выборе категории.