如何处理纯粹与视图相关的命令?

彼德

在我的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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章