在我的MVVM应用程序中,视图中有一个按钮。 当我按下按钮时,我希望在视图中运行一些方法,并且还需要在视图模型中使用一些方法。 我连接命令到我的按钮,所以命令可以在视图模型中运行一些方法。但是我怎么能在视图中运行一些方法呢? 我也尝试连接一个点击事件,但它不起作用。 什么是从视图和视图模型运行功能的最佳方式。Wpf MVVM按钮调用方法在视图和视图模型中也是
谢谢,
在我的MVVM应用程序中,视图中有一个按钮。 当我按下按钮时,我希望在视图中运行一些方法,并且还需要在视图模型中使用一些方法。 我连接命令到我的按钮,所以命令可以在视图模型中运行一些方法。但是我怎么能在视图中运行一些方法呢? 我也尝试连接一个点击事件,但它不起作用。 什么是从视图和视图模型运行功能的最佳方式。Wpf MVVM按钮调用方法在视图和视图模型中也是
谢谢,
on Click事件,执行命令。
private void btnClick(object sender, RoutedEventArgs e)
{
var btn = sender as Button;
btn.Command.Execute(btn.CommandParameter);
}
如果按钮已经有一个命令集,肯定这不会工作?正如OP已经提到的那样。不错的主意。 –
是的,你必须从xaml命令设置并从视图文件中调用该命令,并且我建议这是因为他想调用两者,在这种情况下,这是他可以实现的可能方式 –
您可以通过互动这样做完全是在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>
在这种情况下,两个窗口的处理程序和各两个视图模型的命令被调用。如果处理程序将e.Handled设置为true,则viewmodel命令不会被调用。如果在cmd:EventToCommand中设置了PassEventArgsToCommand =“True”,那么您可以指定一个接受参数的处理程序;在第一个viewmodel处理程序中将Handled设置为true将不会停止正在调用的第二个,但仍可以手动检查第二个处理程序中的值。
现在,那说我会强烈鼓励你重新评估你的架构。调用代码隐藏是而不是 MVVM,并且在7年多的时间里每天都这样做,我还没有看到一个实际需要的情况。
调用后面的代码很好,它仍然是MVVM如果它是在视图后面的代码中查看相关的代码。尽管如此,你的答案仍然是+1。 – slugster
问题是,一般而言,您放置在您的代码中的任何代码都需要进行单元测试,并且无法测试的代码应该不在商业质量应用程序中。原则上,我确实同意你的看法,自定义控件不是特定于应用程序的,它可能是一个很好的例子,其中代码隐藏可以在不中断MVVM的情况下节省大量麻烦,但以我的经验排除除最简单的界面组件之外的所有界面。 –
我会高度质疑您的决定,“按钮单击时运行视图和viewmodel方法”。对我来说,你想要的就是那个按钮运行一个viewmodel命令,这个命令反过来会引起视图的一些变化。例如,如果可以不通过UI而从应用程序中的其他地方执行该方法。不应该改变观点吗?
为此,我建议创建一个接口I [something] View,该视图将实现以及视图模型引用哪个接口。然后,视图模型可以调用接口上的方法,该方法将执行您期望的按钮单击操作。
[另一种方法](http://stackoverflow.com/a/6421602/109702):绑定到视图代码后面的命令,然后通过该VM实现的接口调用视图模型。 – slugster