У меня есть следующее поведение:
public class NavigateAndBroadcastAction : NavigateToPageAction
{
protected override void Invoke(object parameter)
{
base.Invoke(parameter);
Messenger.Default.Send<NavigatingMessage<ViewModelBase>>(new NavigatingMessage<ViewModelBase>(this, PassedObject), NavigationToken);
}
public ViewModelBase PassedObject
{
get { return (ViewModelBase)GetValue(PassedObjectProperty); }
set { SetValue(PassedObjectProperty, value); }
}
// Using a DependencyProperty as the backing store for PassedObject. This enables animation, styling, binding, etc...
public static readonly DependencyProperty PassedObjectProperty = DependencyProperty.Register("PassedObject", typeof(ViewModelBase), typeof(NavigateAndBroadcastAction), new PropertyMetadata(null));
...
}
Он в основном использует NavigateToPageAction (также доступен в Blend), но позволяет также транслировать объект ViewModel (я использую его для перехода от страницы списка к странице сведений и для передачи выбранного объекта)
Xaml будет выглядеть так: (привязка PassedObject относится к экземпляру DetailViewModel, который наследуется от ViewModelBase)
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseLeftButtonDown">
<b:NavigateAndBroadcastAction TargetPage="/View/SubjectDetailPage.xaml" NavigationToken="SubjectDetailNavigationToken" PassedObject="{Binding}" />
</i:EventTrigger>
</i:Interaction.Triggers>
Теперь я хочу зарегистрироваться для сообщения:
Messenger.Default.Register<NavigatingMessage<DetailViewModel>>(this, NavigationToken, true, Action);
Но это не работает. Что работает, так это регистрация на NavigatingMessage<ViewModelBase>
, а затем приведение полученного сообщения к NavigatingMessage<DetailViewModel>
. Есть ли способ обойти это?
Можно ли сделать так, чтобы мессенджер обнаружил фактический тип отправляемого объекта и правильно доставил его объектам, зарегистрированным для этого типа?