我有一个简单的WPF页面,其中包含一个文本框字段,当页面显示时我的客户端需要突出显示该字段。在代码背后,它将是三行,但我正在通过MVVM(我开始认为有点过高评价)。我已经尝试了很多不同的行为和全局事件变体FocusManager.FocusedElement
,但我没有做任何事情。
最终我使用的大多数代码都称这两行:
Keyboard.Focus(textBox);
textBox.SelectAll();
但无论我把这些线放在哪里,文本框都只是聚焦;没有选择文字。我从来没有遇到过如此简单的事情。我一直在对着互联网打了两个小时。有谁知道怎么做?
同样,我想要做的就是在页面导航到的时候选择文本框并选择文本。请帮忙!
答案 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,您就会很快意识到这一点。