2013-08-05 106 views
1

我在这里看到一个问题,其中OP问到绑定事件到ViewModel。基本上,ViewModel应该重新呈现一个包含来自Model的必要数据的抽象View,这样View也可以使用Bindings。但为了能够全部填充ViewModel必须也能够转换视图中发生的大部分用例,例如,如果搜索文本框为空,搜索按钮将变灰。这很好,但让事件添加到游戏中。如果Button.Click可以绑定到ViewModel中的EventHandler,并且在事件处理程序中可以使用模型对象,那将更容易。ViewModel处理事件

现在我的问题是,因为WPF支持事件驱动的编程为什么可以在ViewModel中处理斜坡事件?我如何提供绑定事件funcionality?

回答

1

事件处理程序将坐在视图的代码隐藏文件后面。如果您使用的是MVVM,那么您需要最小化代码隐藏文件中的代码量。

WPF支持命令,并且ICommand接口包括CanExecuteExecute方法。有实现ICommand,允许这些方法在视图模型上实现。

话虽如此,指挥也有其局限性,所以you should consider using an MVVM framework when using MVVM。类似于Caliburn.Micro附带的Actions也允许基于控制事件调用视图模型上的动词。

+0

你说得对。还有其他框架与行动和类似的东西,但仍然。很常见的是,一旦你点击一个按钮,你需要从模型中得到一些额外的信息来做一些特定的验证或类似的事情,如果你使用附加属性或附加命令来完成这个小任务,它听起来像是一种解决方法。所有这些只是因为绑定事件不起作用。 –

+0

绑定事件确实有效,但正如我所说的,处理程序会坐在视图的代码后面。 MVVM是WPF中可实现的设计模式,但这需要一些不是开箱即用的实现。因此,强烈建议您使用MVVM框架来避免尝试将已完成的工作重新实现为极高的标准。 MVVM框架不仅解决了指挥问题,而且还解决了如果您试图单独实施MVVM时将面临的一系列问题。 – devdigital

+0

你能提供一些关于这方面的链接吗?以防有人在互联网上绊倒这个问题。 –

1

这是因为事件的使用显式地破坏了MVVM模式(我相信你知道)。然而,还有另外一种方法 - 使用Attached Command Behaviour pattern。更多信息here

代码为附加命令的一个小而伟大的框架可以从here下载。

我希望这会有所帮助。


编辑。附加的行为允许您在不中断MVVM模式的情况下使用事件。使用就像

<Border Background="Yellow" Width="350" Margin="0,0,10,0" Height="35" CornerRadius="2" x:Name="test"> 
    <local:CommandBehaviorCollection.Behaviors> 
     <local:BehaviorBinding Event="MouseLeftButtonDown" 
           Action="{Binding DoSomething}" 
           CommandParameter="An Action on MouseLeftButtonDown"/> 
     <local:BehaviorBinding Event="MouseRightButtonDown" 
           Command="{Binding SomeCommand}" 
           CommandParameter="A Command on MouseRightButtonDown"/> 
    </local:CommandBehaviorCollection.Behaviors> 
    <TextBlock Text="MouseDown on this border to execute the command"/> 
</Border> 
+0

谢谢。我意识到MVVM模式,我仍然想知道,因为就像我在我的问题中提到的那样,MVVM模式意味着保持View和Model sparate,但使用包含Model中数据的ViewModel,并使用其定制逻辑表示抽象View。现在视图有事件,为什么不能在ViewModel中处理这些事件,因为ViewModel包含了大部分视图逻辑呢? –

+0

在设计中,一个UI组件或'View'的事件处理程序必须包含在后面的'View'代码中 - 这是什么打破了MVVM模式。我上面说过的是,你可以拥有你的蛋糕(MVVM)并且吃掉它(使用附加的命令)来复制事件处理程序的使用。我会更新我的答案以提供一个使用示例... – MoonKnight

+0

我得到你。我不想窃取你的时间与代码的例子。这更多的是一种讨厌。无论如何,除了事实上你只能在控件上放置一个命令,而你可能有100个不同的事件,这些命令总是很棒。用于文本输入,用于点击,用于鼠标悬停。 –