【问题标题】:MouseDown, PreviewMouseDown, etc... and COMMAND Binding in MVVMMouseDown、PreviewMouseDown 等...以及 MVVM 中的 COMMAND 绑定
【发布时间】:2012-08-29 12:08:11
【问题描述】:

我正在尝试理解这个概念,但它却让我难以理解。

这背后的一般概念是什么?我知道这是可能的,但我并没有完全按照我的研究/自己的测试项目来做到这一点。

我想在我的视图中不惜一切代价避免代码落后。我想从视图中解耦诸如“PreviewMouseDown”之类的事件,并让它们触发 ViewModel 中的命令。

谁能给我一些关于如何完成此任务的基本指导?

总结:

View (PreviewMouseDown) -> 在 ViewModel (MyPreviewMouseDownCommand) 中调用命令

谢谢

【问题讨论】:

  • 代码隐藏并不是什么可怕的罪过。使用代码隐藏很容易解决某些任务。 MVVM 模式的主要思想是不允许 VM 对 View 了解太多。并且视图必须对模型一无所知。如果您的代码隐藏仅适用于视图 - 没关系。即使它依赖于 VM - 它仍然可以。

标签: wpf mvvm binding command mousedown


【解决方案1】:

这通常通过某种形式的Attached Property(Blend) Behavior 处理。

例如,MVVM Light 包含一个 EventToCommand Behavior,它允许您将任何事件路由到 XAML 中的 ICommand,而无需添加任何代码。

【讨论】:

  • 另一种选择是使用 Blend SDK 的 EventTrigger 和 InvokeCommandAction。与 EventToCommand 相比,它的缺点是 InvokeCommandAction 不允许将事件 args 作为参数传递给命令。
【解决方案2】:

有被否决的风险,我认为这不是世界上最糟糕的事情

public void PreviewMouseDown(Object sender, RoutedEventArgs e)
{
    var viewModel= (MyViewModel)DataContext;
    if (viewModel.MyCommand.CanExecute(null))
        viewModel.MyCommand.Execute(null);
}

【讨论】:

    【解决方案3】:

    这一切都与CommandingBinding 有关。但我会鼓励您更好地使用为您提供管道的框架。如果您想查看第一个策略,您可以按照Reed 的建议使用 MVVM Light。但是,如果您希望 ViewModel 第一种方法(我个人发现它更易于理解),那么我建议您使用 Caliburn Micro

    无论如何,如果您想清理代码隐藏,最终将使用 Event to Command 或交互库(来自 Blend SDK)。

    【讨论】:

    • 谢谢大家的好建议。
    猜你喜欢
    • 2014-10-17
    • 2020-07-28
    • 2016-03-07
    • 1970-01-01
    • 2014-11-17
    • 2011-09-16
    • 2018-03-29
    • 2014-02-09
    • 1970-01-01
    相关资源
    最近更新 更多