MVVM Light Messenger служба не получает сообщение в виде модели - PullRequest
0 голосов
/ 11 декабря 2018

Не уверен, что я просто делаю это неправильно или неправильно понимаю некоторые примеры уже переполнения стека здесь и здесь .

Я пытаюсь взятьвыбранный элемент из моей первой модели представления и передать его другой модели представления, к которой я перемещаюсь.Цель этого состоит в том, чтобы я мог отобразить переданный элемент и позволить пользователю работать с ним.

Передача из первого вида модели

Это простоНебольшой фрагмент модели первого вида.Здесь я впервые перехожу к новой модели страницы / вида.Затем передайте объект SelectedRule с помощью мессенджера.Навигация выполняется с использованием класса / навигационного сервиса ViewModelLocator, предоставляемого с MVVM Light.

private ApprovedBomRule _selectedRule = new ApprovedBomRule();

public ApprovedBomRule SelectedRule
{
    get { return _selectedRule;}
    set { Set(ref _selectedRule, value); }
}

private void NavigateToUpdateRule()
{
    //Navigate to Update Rule page
    _navigationService.NavigateTo("UpdateBomRuleView");
    //Pass selected rule as a parameter using messenger service
    ApprovedBomRule ruleToSend = SelectedRule; // Selected by user.
    Messenger.Default.Send(ruleToSend);
}

При получении модели вида

Вот моя вторая модель вида, в которой я регистрируютот же тип SelectedRule сверху и установите его в публичную переменную.

public class UpdateBomRuleViewModel : ViewModelBase
{
    private ApprovedBomRule _passedRule;

    public ApprovedBomRule PassedRule
    {
        get => _passedRule;
        set => Set(ref _passedRule, value);
    }
    //Constructor
    public UpdateBomRuleViewModel()
    {
        //Register message type
        Messenger.Default.Register<ApprovedBomRule>(this, GetMessage);
    }
    //Set the property to passed object
    public void GetMessage(ApprovedBomRule rule)
    {
        PassedRule = rule;
    }
}

Мой конструктор достигнут, и задан метод register, но функция GetMessage () никогда не вызывается.Что мне здесь не хватает?

EDIT

Я сузил проблему до того факта, что метод register вызывается после отправки сообщения.Теперь вторая проблема, с которой я сталкиваюсь, - как мне зарегистрировать модель второго вида перед отправкой?Я использую локатор viewmodel на своих страницах, чтобы определить модели представления для каждой страницы.Несмотря на то, что я выполняю _navigation.NavigateTo () перед отправкой данных, модель представления не инициализируется до окончания отправки.

Пример локатора модели представления на странице

<local:BasePage x:Class="YAI.BomConfigurator.Desktop.Views.Rules.UpdateBomRuleView"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  xmlns:local="clr-namespace:YAI.BomConfigurator.Desktop"
  mc:Ignorable="d" 
  d:DesignHeight="450" d:DesignWidth="800"
  Title="UpdateBomRuleView"
  DataContext="{Binding UpdateBomRuleViewModel, Source={StaticResource Locator}}">

<Grid>
    <TextBlock Text="{Binding PassedRule.Description}" 
               VerticalAlignment="Center"
               HorizontalAlignment="Center">

    </TextBlock>
</Grid>

1 Ответ

0 голосов
/ 11 декабря 2018

Хорошо, я нашел решение проблемы.Я использовал мой ServiceLocator, чтобы получить экземпляр перед навигацией.

 var vm = ServiceLocator.Current.GetInstance<UpdateBomRuleViewModel>();
 //Navigate to Update Rule page
 _navigationService.NavigateTo("UpdateBomRuleView");
 //Pass selected rule as a parameter using messenger service
 ApprovedBomRule ruleToSend = SelectedRule; // Selected by user.
 Messenger.Default.Send(ruleToSend);

Это вызвало вызов моего регистра перед отправкой.Мне не обязательно это решение, потому что var vm ни для чего не используется, но пока работает.

спасибо, что посмотрели на вопрос.

...