mvvmcross iOS Messenger - - PullRequest
       5

mvvmcross iOS Messenger -

0 голосов
/ 06 мая 2018

Извините заранее, потому что я новичок в этом. Я пытаюсь вызвать метод со строкой в ​​другом viewmodel, и я прочитал, что использование MvxMessenger, по сути, мой лучший вариант для этого. Что я не понимаю, потому что я едва могу найти документацию / пример кода, чтобы помочь мне, так это как это сделать

Всякий раз, когда я нажимаю кнопку в FilterViewModel, я также хочу, чтобы он вызывал метод в SearchHistoryViewModel со строкой из FilterViewModel. Как правило, если код SearchHistoryViewModel даже правильный, как мне правильно отправить / опубликовать это сообщение?

FilterViewModel

public class SearchHistoryFilterViewModel : MvxViewModel
{
    private string _name;
    public string Name
    {
        get { return _name; }
        set { _name = value;
            RaisePropertyChanged(() => Name);
        }
    }

    public SearchHistoryFilterViewModel(IMvxMessenger messenger)
    {
        //_token = messenger.Subscribe
        //_messenger = messenger;
    }

    public IMvxCommand FilterCommand
    {
        get
        {
            return new MvxCommand(FilterByName);
        }
    }

    public void FilterByName()
    {
        //Whenever this method is triggered, send a message with the Name in it
        SearchFilterMessage message = new SearchFilterMessage(this, Name);
        //Send message
          ... ? /////////////////////
    }`

SearchHistoryViewModel

public class SearchHistoryViewModel : MvxViewModel
{

  //properties
  ...
  ...
    private readonly MvxSubscriptionToken _token; 


    //ctor
    public SearchHistoryViewModel(ISearchHistoryService searchHistoryService, IMvxNavigationService navigationService, IMvxMessenger messenger)
    {
        _searchHistoryService = searchHistoryService;
        _navigationService = navigationService;

  /*Subscribe - Whenever a SearchFilterMessage is received, trigger the 
  OnFilterMessage method */
        _token = messenger.Subscribe<SearchFilterMessage>((message => { 
  OnFilterMessage(message.FilterName); })
            );
    }

    //methods
  ....
  ....
  ....
    /* Do this Whenever the SearchFilterMessage is received*/
   public async void OnFilterMessage(string name)
    {
        HistoryItems = await _searchHistoryService.GetHistoryByName(name);
    }

1 Ответ

0 голосов
/ 06 мая 2018

Хорошо, поэтому я запутался в том, как объявить сам мессенджер и использовать его без токенов, а не в конструкторе. Решение было предсказуемо просто :( В основном объявляют другого ImvxMessenger и через инъекцию устанавливают его, затем вызывают тот, чтобы Опубликовать это в другом методе

    private IMvxMessenger _messenger;
    public SearchHistoryFilterViewModel(IMvxMessenger messenger)
    {
        //_token = messenger.Subscribe...
        //messenger.Publish<SearchFilterMessage>(FilterByName());
        _messenger = messenger;
    }

    public void FilterByName()
    {
        Debug.WriteLine(Name);
        SearchFilterMessage message = new SearchFilterMessage(this, Name);
        //Send message
        _messenger.Publish<SearchFilterMessage>(message);

    }
...