在我的WPF窗口中,我放置了一个普通的文本框,当按下Ctrl + F时希望将其聚焦。
因为我想尽可能地保持它与MVVM相似,所以我InputBindings
在窗口上使用了将该输入事件绑定到ViewModel中提供的Command的方法(这已经破坏了MVVM模式,因为整个动作仅意味着作为一部分)视图(我认为不是),因为Command是要绑定到的对象)。
ViewModel如何与视图通信以使文本框聚焦?我读到,这已经打破了MVVM模式,但有时仅仅是必要的,否则是不可能的。但是,在ViewModel本身中设置焦点将完全破坏MVVM模式。
我原本打算将窗口中的当前焦点控件绑定到ViewModel的属性,但是甚至很难确定WPF中当前焦点的元素(这总是让我怀疑这样做是否真的是正确的方法)。
经过几天的努力,考虑并评估了所有选项,我终于找到了解决之道。我在窗口标记中添加了命令绑定:
<Window.InputBindings>
<KeyBinding Command="{Binding Focus}" CommandParameter="{Binding ElementName=SearchBox}" Gesture="CTRL+F" />
</Window.InputBindings>
我的ViewModel中的命令(在这种情况下,我将类缩减为重要的内容):
class Overview : Base
{
public Command.FocusUIElement Focus
{
get;
private set;
}
public Overview( )
{
this.Focus = new Command.FocusUIElement();
}
}
最后是命令本身:
class FocusUIElement : ICommand
{
public event EventHandler CanExecuteChanged;
public bool CanExecute ( object parameter )
{
return true;
}
public void Execute ( object parameter )
{
System.Windows.UIElement UIElement = ( System.Windows.UIElement ) parameter;
UIElement.Focus();
}
}
这可能不是straight MVVM-但是stijn的回答有一个好处:
因此,不要再太在意打破您使用的任何模式并改用解决方案了。
通常,我会按惯例组织工作,特别是当我还不熟悉某些东西时,但是我看不出有什么不对的地方。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句