2010-04-22 2 views
1

Использование Silverlight 4.MVVM visualstatemanager и focus

У меня есть два визуальных состояния для моего контроля. Я хочу изменить фокус с одного текстового поля на другое, когда состояния меняются.

Каков наилучший способ использования MVVM?

Я надеялся использовать визуализатор, чтобы сделать это или поведение ... но я не понял пути.

ответ

4

Если бы я тебя, я бы создать FocusBehaviour, с FocusBehavior.IsFocused собственности, добавить, что поведение на вашем Управление и в состоянии VSM установлено IsFocused = True.

1

Изменение фокуса между текстовыми полями является определенно определенным кодом, поэтому я думаю, что это, вероятно, должно быть сделано в коде позади представления. Некоторые люди предлагают не иметь никакого кода, но я думаю, что это немного преувеличение.

А как вызвать его из 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"; } 
    } 

} 
0

solution from the C#er blog очень похож на ответ JustinAngle, но я понял, что это решение Silverlight, о котором идет речь. В основном Jeremy Likeness создает фиктивный контроль, который он называет FocusHelper, который очень похож на FocusBehavior.

Смежные вопросы