如何将发件人和事件的参数传递给ViewModel中的调用命令

时间:2016-12-14 09:40:40

标签: xaml mvvm uwp windows-10 mvvm-light

在我的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();
}

1 个答案:

答案 0 :(得分:0)

EventTriggerBehaviorEventArgs对象传递给每个操作,因此对于InvokeCommandAction,您只需要绑定命令来接受命令实现中的参数。我不是100%熟悉MVVMLight,但你可能正在使用某种“委托命令”实现;只是确保你的代表有一个参数,你就是好人。

如果你也需要sender参数,那么这可能表明你不应该在视图模型中做任何你需要做的事情(直接访问/修改视图不是角色视图模型)。但是,如果您使用x:Bind将事件绑定到视图模型而不是EventTriggerBehaviorx: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属性,您可以在页面代码中设置该属性。

根据您提供的代码,如果您要做的只是在框架导航时清除框架的后堆栈(或其他任何内容),那么您可以将其放入您自己的自定义行为或附加属性以处理视图 - 具体而言。