在我的UWP Windows 10应用程序中,我想从事件和其他东西中清除我的代码隐藏,并在ViewModel中执行所有操作,因此我使用Core:InvokeCommandAction来调用VM中的命令,但我不知道如何传递它的发送者和Frame对象的Navigated事件的参数
<Frame x:Name="MyFrame" SourcePageType="{Binding MainFramePageType, Mode=TwoWay}">
<Interactivity:Interaction.Behaviors>
<Core:EventTriggerBehavior EventName="Navigated">
<Core:InvokeCommandAction Command="{Binding MyFrameNavigatedCommand}" CommandParameter="{Binding ElementName=MyFrame}"/>
</Core:EventTriggerBehavior>
</Interactivity:Interaction.Behaviors>
</Frame>
VM中的:
public RelayCommand<object> MyFrameNavigatedCommand { get; private set; }
...
MyFrameNavigatedCommand = new RelayCommand<object>(MyNavigatedCommandExecuted);
...
private void MyNavigatedCommandExecuted(object sender)
{
(sender as Frame).BackStack.Clear();
}
答案 0 :(得分:0)
EventTriggerBehavior
将EventArgs
对象传递给每个操作,因此对于InvokeCommandAction
,您只需要绑定命令来接受命令实现中的参数。我不是100%熟悉MVVMLight,但你可能正在使用某种“委托命令”实现;只是确保你的代表有一个参数,你就是好人。
如果你也需要sender
参数,那么这可能表明你不应该在视图模型中做任何你需要做的事情(直接访问/修改视图不是角色视图模型)。但是,如果您使用x:Bind
将事件绑定到视图模型而不是EventTriggerBehavior
(x:Bind
需要周年纪念更新SDK),则也可以传递sender参数。
<强> XAML 强>
<Frame x:Name="MyFrame"
SourcePageType="{Binding MainFramePageType, Mode=TwoWay}"
Navigated="{x:Bind Vm.Navigated}"/>
代码
public MyViewModel Vm => (MyViewModel)DataContext;
查看模型
public void Navigated(object sender, NavigationEventArgs e)
{
}
或者,您可以保留已有的内容,但只需在视图模型上公开Frame
属性,您可以在页面代码中设置该属性。
根据您提供的代码,如果您要做的只是在框架导航时清除框架的后堆栈(或其他任何内容),那么您可以将其放入您自己的自定义行为或附加属性以处理视图 - 具体而言。