Wpf MVVM按钮调用方法在视图和视图模型中也是如此

时间:2015-07-28 07:45:08

标签: wpf mvvm

在我的MVVM应用程序中,视图中有一个按钮。 当我按下一个按钮时,我希望在视图中运行一些方法,以及视图模型中的一些方法。 我将命令连接到我的按钮,因此该命令可以在视图模型中运行某些方法。但是我怎么能在视图中运行一些方法呢? 我也尝试连接点击事件,但它不起作用。 从view和viewmodel运行函数的最佳方法是什么。

谢谢,

3 个答案:

答案 0 :(得分:2)

您可以使用交互式触发器在XAML中完全执行此操作:

    <Button Content="Do Something" Click="OnClickHandler"
            xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
            xmlns:cmd ="http://www.galasoft.ch/mvvmlight">

        <i:Interaction.Triggers>
            <i:EventTrigger EventName="Click">
                <cmd:EventToCommand Command="{Binding Path=ViewModelCommand1}" />
                <cmd:EventToCommand Command="{Binding Path=ViewModelCommand2}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>

    </Button>

在这种情况下,将调用Window处理程序和两个viewmodel命令中的每一个。如果处理程序将e.Handled设置为true,则不会调用viewmodel命令。如果设置PassEventArgsToCommand =&#34; True&#34;在cmd:EventToCommand中,您可以指定一个接受args的处理程序;设置在第一个viewmodel处理程序中处于true状态,​​不会停止第二个被调用,但你仍然可以手动检查第二个处理程序中的值。

现在,我说强烈鼓励您重新评估您的架构。调用代码隐藏是而不是 MVVM,并且在每天这样做的7年多的时间里,我还没有看到实际需要它的单个案例。

答案 1 :(得分:1)

在Click事件上,执行命令。

private void btnClick(object sender, RoutedEventArgs e)
        {
            var btn = sender as Button;
            btn.Command.Execute(btn.CommandParameter);
        }

答案 2 :(得分:0)

我非常怀疑你决定“在按钮点击时运行view和viewmodel方法”。对我来说,似乎你想要的是该按钮运行一个viewmodel命令,这反过来导致视图中的一些变化。如果例如可以不通过UI而是从应用程序中的其他位置执行该方法,该怎么办?观点不应该改变吗?

为此,我建议创建一个界面I [something] View,视图将实现以及视图模型引用的界面。然后,viewmodel可以在界面上调用该方法,该方法将在按钮单击时执行您所期望的操作。