Silverlight4を使用します。
コントロールには2つの視覚的な状態があります。状態が変化したときに、フォーカスをあるテキストボックスから別のテキストボックスに変更したいと思います。
MVVMを使用してこれを行うための最良の方法は何ですか?
私はそれまたは振る舞いをするためにvisualstatemanagerを使用することを望んでいました...しかし私は方法を理解していません。
Silverlight4を使用します。
コントロールには2つの視覚的な状態があります。状態が変化したときに、フォーカスをあるテキストボックスから別のテキストボックスに変更したいと思います。
MVVMを使用してこれを行うための最良の方法は何ですか?
私はそれまたは振る舞いをするためにvisualstatemanagerを使用することを望んでいました...しかし私は方法を理解していません。
私があなたなら、FocusBehavior.IsFocused プロパティを使用して FocusBehaviour を作成し、その動作をコントロールに追加し、VSM 状態で IsFocused=True を設定します。
テキスト ボックス間のフォーカスの変更は、間違いなくビュー固有のコードであるため、おそらくビューのコード ビハインドで行う必要があると思います。コードをまったく持たないことを提案する人もいますが、それは少し誇張されていると思います。
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"; }
}
}
C#er ブログのソリューションは JustinAngle の回答とかなり似ていますが、言及する必要がある Silverlight 固有のソリューションであるため、私は理解しました。基本的に、Jeremy Likeness は、FocusBehavior と非常によく似た動作をする、FocusHelper と呼ばれるダミー コントロールを作成します。