1

我在这里看到了一个问题,其中 OP 询问了将事件绑定到 ViewModel 的问题。基本上 ViewModel 应该代表一个包含来自模型的必要数据的抽象视图,以便视图也可以使用绑定。但是为了能够满足 ViewModel 的所有功能,还必须转换 View 中发生的大多数用例,例如,如果搜索文本框为空,则搜索按钮应显示为灰色。这很好用,但可以向游戏中添加事件。如果 Button.Click 可绑定到 ViewModel 中的 EventHandler 和事件处理程序内部,那么您将能够使用模型对象,这将更容易。

现在我的问题是,既然 WPF 支持事件驱动编程,为什么不能在 ViewModel 中处理事件?我如何提供绑定事件功能?

4

2 回答 2

1

事件处理程序将位于视图的代码隐藏文件中。如果您使用的是 MVVM,那么您需要尽量减少代码隐藏文件中的代码量。

WPF 支持命令,ICommand接口包含一个CanExecuteandExecute方法。有一些实现ICommand允许在视图模型上实现这些方法。

话虽如此,指挥也有其局限性,所以在使用 MVVM 时应该考虑使用 MVVM 框架。像Caliburn.Micro这样的东西带有Actions,它还允许基于控制事件调用视图模型上的动词。

于 2013-08-05T09:18:04.637 回答
1

这是因为事件的使用显式地破坏了 MVVM 模式(我相信你知道)。然而,还有另一种解决方法——使用附加命令行为模式。更多信息在这里

可从此处下载小而强大的附加命令框架的代码。

我希望这有帮助。


编辑。附加行为允许您在不破坏 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>
于 2013-08-05T09:19:30.457 回答