Я пытаюсь выполнить 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;
}
}