を含むいくつかのコントロールを持つビュー ( X.XamlCheckBox
) があります。
チェックするCheckBox
と、セッションをTrueにする必要があり、チェックを外すと、セッションをFalseにする必要があります。
コード ビハインドで実行する場合はX.Xaml.cs
簡単ですが、コードをクリーンにしたいと考えています。
Command を使用してViewModel側で処理する方法はありますか?
を含むいくつかのコントロールを持つビュー ( X.XamlCheckBox
) があります。
チェックするCheckBox
と、セッションをTrueにする必要があり、チェックを外すと、セッションをFalseにする必要があります。
コード ビハインドで実行する場合はX.Xaml.cs
簡単ですが、コードをクリーンにしたいと考えています。
Command を使用してViewModel側で処理する方法はありますか?
IsChecked-PropertyでViewModel-PropertyへのTwoWay-Bindingを作成し、そのプロパティの変更に対応できないのはなぜですか?
viewModelで:
private bool _IsSessionEnabled;
public bool IsSessionEnabled
{
get { return _IsSessionEnabled; }
set {
if (_IsSessionEnabled != value) {
_IsSessionEnabled = value;
this.OnPropertyChanged();
this.switchSession(value); /* this is your session code */
}
}
}
とビューで:
<CheckBox IsChecked={Binding IsSessionEnabled, Mode=TwoWay}
Content="Session active" />
イベントを発生させる前(または必要に応じて後)に、独自のOnPropertyChanged実装でプロパティの変更に応答する方がさらにクリーンです。
あなたの質問に答えるには: はい、あります。
Command
以下を実装するクラスを作成する必要がありますICommand
。
public class MyCommand : ICommand
{
Action<bool> _action;
public MyCommand(Action<bool> action)
{
_action = action;
}
public bool CanExecute(object parameter)
{
return true;
}
public event System.EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
_action((bool)parameter);
}
}
次に、ViewModel でコマンド自体を作成します。
private MyCommand simpleCommand;
public MyCommand SimpleCommand
{
get { return simpleCommand; }
set { simpleCommand = value; }
}
public MainViewModel()
{
SimpleCommand = new MyCommand(new Action<bool>(DoSomething));
}
public void DoSomething(bool isChecked)
{
//something
}
Checkbox
コマンドをそれにバインドCommandParameter
し、Checkbox.IsChecked
<CheckBox Name="checkBox1" Command="{Binding Path=SimpleCommand}" CommandParameter="{Binding ElementName=checkBox1, Path=IsChecked}" />
しかし、それは少し誇張されています。bool
おそらく、ViewModel でそれぞれのプロパティを作成し、それにバインドして、アクセサー内で必要なコードを呼び出す方がよいでしょう。
コマンドを使用することも、変更通知でデータ バインディングを使用することもできます。
ビューでは、チェックボックスのコマンド プロパティにバインドするだけです。コマンド Changed を呼び出しているだけです。
Command={Binding Changed}"
ビューモデル
bool session = false;
RelayCommand Changed = new RelayCommand(()=>{this.session = !this.session});