如何将焦点设置为 AND SELECT ALL 初始文本框(MVVM 样式)?

Jor*_*dan 5 wpf focus

我有一个简单的 WPF 页面,其中有一个文本框字段,我的客户希望在页面显示时突出显示该字段。在后面的代码中,它将是三行,但我正在通过 MVVM(我开始认为它有点被高估了)。我已经尝试了许多不同的行为和全局事件变体FocusManager.FocusedElement,但我所做的一切都不会这样做。

最终,我使用的大部分代码都调用了这两行:

Keyboard.Focus(textBox);
textBox.SelectAll();
Run Code Online (Sandbox Code Playgroud)

但无论我把这些行放在哪里,文本框都只聚焦;未选择任何文本。我从来没有在这么简单的事情上遇到过这么多麻烦。我已经在互联网上打了两个小时的头。有谁知道如何做到这一点?

同样,我想要做的就是让文本框获得焦点,并且在导航到页面时选择所有文本。请帮忙!

Fed*_*gui 7

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

将其放在代码后面。它根本不会破坏 MVVM 分离。

public void WhateverControl_Loaded(stuff)
{
    Keyboard.Focus(textBox);
    textBox.SelectAll();
}
Run Code Online (Sandbox Code Playgroud)

如果您需要响应特定的应用程序/业务逻辑来执行此操作。创建附加属性。

或者:

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

this.DataContext as MyViewModel;
Run Code Online (Sandbox Code Playgroud)

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

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

    public void SomeLogic()
    {
        if (SomeCondition)
            INeedToFocusStuff();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将其连接到视图中:

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

public void FocusMyStuff()
{
    WhateverTextBox.Focus();
}
Run Code Online (Sandbox Code Playgroud)

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


没有任何 MVVM 不会被高估,MVVM 非常有帮助,我什至会说是必要的。一旦您开始使用 ItemsControl(例如ListBoxes 或DataGrids),您就会很快意识到这一点。