Выполнение команды после перехода на страницу (ReactiveUI, UWP) - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь выполнить ReactiveCommand после того, как получу NavigationEventArgs из OnNavigatedTo(NavigationEventArgs e) из Page.

Моей первой попыткой было использование наблюдаемых событий, однако для NavigateTo события отсутствуют.

Моя вторая попытка описана ниже.Кажется, что WhenActivated вызывают после OnNavigatedTo.К этому времени OnNavigated уже вызывается и, следовательно, navigated не упускает возможности прослушать событие.

public sealed partial class ShareTargetPage : Page, IViewFor<ShareTargetViewModel>
{
    public event EventHandler<SharedDataEventArg> Navigated;

    private void OnNavigated(SharedDataEventArg e)
    {
        Navigated?.Invoke(this, e);
    }

    private IObservable<EventPattern<SharedDataEventArg>> navigated;

    public ShareTargetPage()
    {
        navigated = Observable.FromEventPattern<SharedDataEventArg>(h => Navigated += h, h => Navigated -= h);

        InitializeComponent();
        ViewModel = new ShareTargetViewModel();

        this.WhenActivated(disposable =>
        {
            navigated
                .Select(x=> x.EventArgs)
                .InvokeCommand(this, x => x.ViewModel.ParseCommand)
                .DisposeWith(disposable);
        });
    }

    protected override async void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);
        var operation = (e.Parameter as ShareOperation);
        OnNavigated(new SharedDataEventArg(operation, await operation?.Data?.GetWebLinkAsync()));

    }

    public static readonly DependencyProperty ViewModelProperty = DependencyProperty
        .Register(nameof(ViewModel), typeof(ShareTargetViewModel), typeof(ShareTargetPage), new PropertyMetadata(null));

    public ShareTargetViewModel ViewModel
    {
        get => (ShareTargetViewModel)GetValue(ViewModelProperty);
        set => SetValue(ViewModelProperty, value);
    }

    object IViewFor.ViewModel
    {
        get => ViewModel;
        set => ViewModel = (ShareTargetViewModel)value;
    }
}

1 Ответ

1 голос
/ 15 мая 2019

Моей первой попыткой было использование наблюдаемых событий, однако для NavigateTo событие отсутствует.

Вы можете создать тему и выбросить Subject.OnNext(MyOnNavigatedToEventInformation) в переопределении.

Моя вторая попытка описана ниже.Похоже, что WhenActivation вызывается после OnNavigatedTo.К этому времени OnNavigated уже вызывается, и, следовательно, навигация не упускает возможности прослушать событие.

Можно ли использовать Publish и Connect для создания подключенной наблюдаемой?Вы должны быть в состоянии захватить событие в наблюдаемой и затем выдать полную последовательность, когда вы .Connect().

Публикация

Соединение

Вопрос, ожидаете ли вы, что WhenActivated следует вызвать до OnNavigatedTo?

...