如何将焦点设置在AND SELECT ALL的初始文本框(MVVM-Style)?

时间:2014-01-09 16:46:11

标签: wpf focus

我有一个简单的WPF页面,其中包含一个文本框字段,当页面显示时我的客户端需要突出显示该字段。在代码背后,它将是三行,但我正在通过MVVM(我开始认为有点过高评价)。我已经尝试了很多不同的行为和全局事件变体FocusManager.FocusedElement,但我没有做任何事情。

最终我使用的大多数代码都称这两行:

Keyboard.Focus(textBox);
textBox.SelectAll();

但无论我把这些线放在哪里,文本框都只是聚焦;没有选择文字。我从来没有遇到过如此简单的事情。我一直在对着互联网打了两个小时。有谁知道怎么做?

同样,我想要做的就是在页面导航到的时候选择文本框并选择文本。请帮忙!

1 个答案:

答案 0 :(得分:3)

“焦点”和“从文本框中选择所有文本”是特定于视图的关注

把它放在代码背后。它根本不会破坏MVVM分离。

public void WhateverControl_Loaded(stuff)
{
    Keyboard.Focus(textBox);
    textBox.SelectAll();
}

如果您需要这样做以响应特定的应用程序/业务逻辑。创建附加属性。

让您的View通过以下方式解析ViewModel:

this.DataContext as MyViewModel;

然后在您可以挂钩的ViewModel中创建一些事件:

public class MyViewModel
{
    public Action INeedToFocusStuff {get;set;}

    public void SomeLogic()
    {
        if (SomeCondition)
            INeedToFocusStuff();
    }
}

然后将其挂钩在视图中:

public void Window_Loaded(Or whatever)
{
    var vm = this.DataContext as MyViewModel;
    vm.INeedToFocusStuff += FocusMyStuff;
}

public void FocusMyStuff()
{
    WhateverTextBox.Focus();
}

了解这个简单的抽象如何在ViewModel中的View和ViewModel相关内容中保持View相关内容,同时允许它们进行交互。把事情简单化。对于WPF应用程序,您不需要NASA的服务器。


没有MVVM没有被高估,MVVM非常有帮助,我想说甚至是必要的。一旦开始使用诸如ListBox es或DataGrid s之类的ItemsControl,您就会很快意识到这一点。