2012-02-21 138 views
0

我有一个使用MVVM的应用程序。我正在尝试拦截MCE遥控器上的按键以播放,暂停,停止等。 目前,我正在使用命令绑定与代码中的某个方法执行媒体元素上的相关操作,如有没有比在后面的代码中处理CommandBindings更好的方法?

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

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

编辑 - 我已经将命令绑定从视图内的用户控件移到我的MainWindow.xaml中,并将这些方法放置到MainWindow.xaml.cs中。 MainWindow没有视图/视图模型关系,只是一个ViewModel链接到它的内容控件。 在我的代码背后的方法,我正在使用中介发送消息(播放,暂停,停止等...)到我的mediaplayerviewmodel,它反过来交互与它的相应的看法。这是一个好主意还是有更好的方法?

+0

[如何找到绑定错误的来源?](http://stackoverflow.com/a/8480651/485076) – sll 2012-02-21 19:19:27

回答

1

我认为约什史密斯在他2009年的文章中创造了一个巨大的混乱,当时他提出了一个观点,即他的代码隐藏CS文件基本上是空的。 MVVM并不是没有代码隐藏。这是关于分离问题。如果有什么实际的规则你应该遵循,就是使ViewModel视图不可知(即没有从ViewModel引用到视图,认为你的ViewModel有一个'View'的第二个单元测试实现)。

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

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

+0

Actualy不,它是股票的限制WPF。股票WPF无法在视图或控制器上定义明智的调用方法。 – TomTom 2012-02-23 09:56:02

+1

不确定为什么这被标记?我已经根据最后一段提出了解决方案。我已经创建了自定义的路由命令,它们可以冒泡到主窗口(没有视图),但是会操作视图模型。 – Oli 2012-02-27 11:25:42

0

转向Codeplex.com并寻找Caliburn(或更好的Caliburn Micro)。它扩展了WPF以实际允许调用具有从其他对象拉取的任意参数的方法,并且该方法位于视图模型/控制器中,而不会在代码后面有一个“钩子方法”,只是在调用该方法之后。

扩展可以做到奇妙thignsl ike拉取文本框的值并将其作为参数传递给方法,然后对返回值作出反应 - 很像视图应该。

您运行的是“stock”wpf的限制 - 只能指向代码后面的方法处理程序,而不考虑参数。存在异常,甚至来自微软。

相关问题