Смена фокуса между текстовыми полями - это определенно код, специфичный для вида, поэтому я думаю, что это должно быть сделано в коде позади представления. Некоторые люди предлагают вообще не иметь кода, но я думаю, что это немного преувеличено.
Что касается того, как вызвать его из ViewModel, я бы сделал что-то вроде:
class MyView : UserControl {
// gets or sets the viewmodel attached to the view
public MyViewModel ViewModel {
get {...}
set {
// ... whatever method you're using for attaching the
// viewmodel to a view
myViewModel = value;
myViewModel.PropertyChanged += ViewModel_PropertyChanged;
}
private void ViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e) {
if (e.PropertyName == "State") {
VisualStateManager.GoToState(this, ViewModel.State, true);
if (ViewModel.State == "FirstState") {
textBox1.Focus();
}
else if (ViewModel.State == "SecondState") {
textBox2.Focus();
}
}
}
}
class MyViewModel : INotifyPropertyChanged {
// gets the current state of the viewmodel
public string State {
get { ... }
private set { ... } // with PropertyChanged event
}
// replace this method with whatever triggers your
// state change, such as a command handler
public void ToggleState() {
if (State == "SecondState") { State = "FirstState"; }
else { State = "SecondState"; }
}
}