WPF结合MVVM模式,可以实现界面与代码的完全分离,非常便于开发与维护,但对于某些特定需求,例如TextBox需要Focus获得光标,或者全选其中的文本,这时候就比较难了,因为VM中完全拿不到控件对象,也很难调用Focus()与SelectAll()方法,但也不是完全不可以,有一种利用委托与事件实现的方法,不知道是否有背MVVM分离思想,具体方法如下:
View.xaml:
<TextBox Name="InputBox" Text="{Binding InputStr}"/> View.xaml.cs: public partial class MainView : UserControl { public MainView() { InitializeComponent(); this.Loaded += MainView_Loaded; } private void MainView_Loaded(object sender, RoutedEventArgs e) { InputBox.Focus(); InputBox.SelectAll(); var vm = DataContext as MainViewModel; vm.ControlFocusEvent += View_ControlFocus; } private void View_ControlFocus(string controlName) { switch (controlName) { case "InputBox": InputBox.Focus(); InputBox.SelectAll(); break; default: break; } } }VM:
public delegate void ControlFocusHandler(string controlName); public event ControlFocusHandler ControlFocusEvent; public void Focus() { ControlFocusEvent.Invoke("InputBox"); }