【发布时间】:2012-04-11 22:58:50
【问题描述】:
我有以下行为:
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 绑定到从 ViewModelBase 继承的 DetailViewModel 实例)
<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>。有办法解决吗?
是否可以让信使检测到正在发送的对象的实际类型并正确地传递给注册了该类型的对象?
【问题讨论】:
-
为什么不起作用?你得到一个编译错误?例外?
-
不,简单的消息没有送达
-
不能发送正确类型的消息吗?
-
好吧,我该怎么做呢?我希望行为是通用的,以便在 Xaml 中我可以绑定到从 ViewModelBase 继承的任何对象..
标签: c# silverlight mvvm mvvm-light