有没有比在后面的代码中处理CommandBindings更好的方法?

时间:2012-02-21 18:57:09

标签: wpf mvvm

我有一个使用MVVM的应用程序。我正试图拦截MCE遥控器上的按键,用于播放,暂停,停止等.... 目前我正在使用命令绑定与代码中的方法,然后在媒体元素上执行相关操作

<Window.CommandBindings>
    <CommandBinding Command="MediaCommands.Play" Executed="PlayMediaElement"/>
    <CommandBinding Command="MediaCommands.Stop" Executed="StopMediaElement"/>
</Window.CommandBindings>

在尝试包含远程控制功能之前,我有大约10个视图模型/视图,后面没有任何代码。 我想知道是否有更好的方法来做到这一点,所以我保留了MVVM模式,或者以这种方式实现它是完全可以接受/更好。

编辑 - 我已将Command Bindings从View内的UserControl移动到我的MainWindow.xaml中,并将这些方法放入MainWindow.xaml.cs中。 MainWindow没有view / viewmodel关系,只是一个链接到ViewModel的内容控件。 在我的代码背后的方法中,我正在使用Mediator将消息(播放,暂停,停止等...)发送到我的mediaplayerviewmodel,后者又与其各自的视图进行交互。这是一个好主意还是有更好的方法?

2 个答案:

答案 0 :(得分:1)

我认为Josh Smith在2009年的文章中引起了巨大的困惑,当时他指出他的代码隐藏的CS文件大部分都是空的。 MVVM并不是没有代码隐藏。这是关于分离关注点。如果你应该遵循任何实际规则,那就是使ViewModel视图不可知(即没有从ViewModel引用到View。想想为ViewModel进行第二次单元测试实现'View'。)

这种“没有代码背后”的混淆导致了非常奇怪的结构,只是为了解决一个本不应该存在的问题。

在MainWindow.xaml.cs中隐藏代码是完全合理的解决方案,只要您没有逻辑,只需将调用转发到View Model中的适当方法即可。如果这是我的代码,我会创建自定义命令(来自同一篇文章的la DelegateCommand)直接绑定到ViewModel中的命令,但你的设计也是100%合法的。

答案 1 :(得分:0)

前往Codeplex.com寻找Caliburn(或更好的Caliburn Micro)。它扩展了WPF,实际上允许调用从其他对象中提取的任意参数的方法,并且该方法在视图模型/控制器中,而不需要在代码后面的代码中使用“钩子方法”。

扩展可以很好地执行文本框的值并将其作为参数传递给方法,然后对返回值做出反应 - 就像视图一样。

你运行在“stock”wpf的限制中 - 它只能指向代码后面的方法处理程序而不考虑参数。即使从微软也存在Alterantives。