MVVM visualstatemanager和焦点

时间:2010-04-22 13:38:58

标签: silverlight silverlight-4.0 visualstatemanager

使用Silverlight 4.

我的控制有两种视觉状态。我想在状态改变时将焦点从一个文本框更改为另一个文本框。

使用MVVM执行此操作的最佳方法是什么?

我希望使用visualstatemanager来做这件事或行为......但我还没想出办法。

3 个答案:

答案 0 :(得分:4)

如果我是你,我将使用FocusBehavior.IsFocused属性创建一个FocusBehaviour,在Control上添加该行为,并在VSM状态集中添加IsFocused = True。

答案 1 :(得分: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"; }
    }

}

答案 2 :(得分:0)

solution from the C#er blog与JustinAngle的答案非常相似,但我认为,因为它是一个Silverlight特定的解决方案,值得一提。基本上Jeremy Likeness创建了一个虚拟控件,他称之为FocusHelper,其行为与FocusBehavior非常相似。