MVVM visualstatemanager и фокус - PullRequest
       11

MVVM visualstatemanager и фокус

1 голос
/ 22 апреля 2010

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

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

Каков наилучший способ сделать это с помощью MVVM?

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

Ответы [ 3 ]

4 голосов
/ 22 апреля 2010

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

1 голос
/ 22 апреля 2010

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

Что касается того, как вызвать его из 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 голосов
/ 18 февраля 2013

Решение из блога C # er очень похоже на ответ JustinAngle, но я подумала, что это специфичное для Silverlight решение, которое стоит упомянуть.В основном Джереми Ликенсесс создает фиктивный элемент управления, который он вызывает FocusHelper, который очень похож на FocusBehavior.

...