我有一个简单的 WPF 页面,其中有一个文本框字段,我的客户希望在页面显示时突出显示该字段。在后面的代码中,它将是三行,但我正在通过 MVVM(我开始认为它有点被高估了)。我已经尝试了许多不同的行为和全局事件变体FocusManager.FocusedElement,但我所做的一切都不会这样做。
最终,我使用的大部分代码都调用了这两行:
Keyboard.Focus(textBox);
textBox.SelectAll();
Run Code Online (Sandbox Code Playgroud)
但无论我把这些行放在哪里,文本框都只聚焦;未选择任何文本。我从来没有在这么简单的事情上遇到过这么多麻烦。我已经在互联网上打了两个小时的头。有谁知道如何做到这一点?
同样,我想要做的就是让文本框获得焦点,并且在导航到页面时选择所有文本。请帮忙!
“焦点”和“从文本框中选择所有文本”是特定于视图的关注点。
将其放在代码后面。它根本不会破坏 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),您就会很快意识到这一点。