c# - 如何处理纯粹与 View 相关的命令?

标签 c# .net wpf mvvm visual-studio-express

在我的 WPF 窗口中,我放置了一个普通文本框,我希望在按下 Ctrl+F 时将其聚焦。

由于我希望尽可能保持 MVVM 风格,因此我在窗口上使用 InputBindings 将该输入事件绑定(bind)到 ViewModel 中提供的命令(这已经打破了 MVVM 模式)因为整个操作只是 View 的一部分?我想不是,因为命令是一个要绑定(bind)的对象)。

ViewModel 如何与 View 通信以使文本框聚焦?我读到这已经打破了 MVVM 模式,但有时只是必要的,否则是不可能的。但是,将焦点设置在 ViewModel 本身中将完全打破 MVVM 模式。

我最初打算将窗口中当前聚焦的控件绑定(bind)到 ViewModel 的属性,但甚至很难确定 WPF 中当前聚焦的元素(这总是让我怀疑这是否真的是正确的方法)所以)。

最佳答案

在这种情况下,没有办法不“破坏”纯 MVVM。话又说回来,我很难说它破坏了任何东西。我不认为任何大小合适的 MVVM 应用程序是“纯粹的”。因此,不要太在意打破你使用的任何模式,而是实现一个解决方案。

这里至少有两种方法:

  • 只需在 View 后面的代码中执行所有操作:检查是否按下了按键,如果是,则设置焦点。没有比这更简单的了,你可能会说虚拟机与真正与 View 相关的东西无关
  • 否则,VM 和 View 之间显然必须进行一些通信。这使得一切变得更加复杂:假设您使用 InputBinding,您的命令可以设置一个 bool 属性,然后 View 可以依次绑定(bind)到它来设置焦点。这种绑定(bind)可以像 Sheridan 的答案中那样通过附加属性来完成。

关于c# - 如何处理纯粹与 View 相关的命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19678656/

相关文章:

c# - C# 中哪些操作是原子操作?

c# - RenderTargetBitmap 模糊

c# - 为什么使用 Caliburn Micro Conductor.OneActive 时,Blend Interaction 事件触发器会多次触发?

c# - 有没有比这更有效的方法通过 C# 中的 switch-case 语句运行枚举值?

c# - .NET 中 SerialPort 类的问题

c# - 在 Xamarin Forms 中使用网格显示项目

c# - NUnit 2.5.6 + PartCover 2.0/4.0 = 我的类(class)未显示

c# - 流利的断言 : how to set breakpoint inside lambda

c# - 特定区域怎么画

c# - 在 WPF 3D 中旋转 360 度