5

を含むいくつかのコントロールを持つビュー ( X.XamlCheckBox ) があります。

チェックするCheckBoxと、セッションをTrueにする必要があり、チェックを外すと、セッションをFalseにする必要があります。

コード ビハインドで実行する場合はX.Xaml.cs簡単ですが、コードをクリーンにしたいと考えています。

Command を使用してViewModel側で処理する方法はありますか?

4

3 に答える 3

6

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実装でプロパティの変更に応答する方がさらにクリーンです。

于 2013-01-21T16:02:34.410 に答える
6

あなたの質問に答えるには: はい、あります。

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 でそれぞれのプロパティを作成し、それにバインドして、アクセサー内で必要なコードを呼び出す方がよいでしょう。

于 2013-01-21T15:36:04.167 に答える
0

コマンドを使用することも、変更通知でデータ バインディングを使用することもできます。
ビューでは、チェックボックスのコマンド プロパティにバインドするだけです。コマンド Changed を呼び出しているだけです。

Command={Binding Changed}"

ビューモデル

bool session = false;
RelayCommand Changed = new RelayCommand(()=>{this.session = !this.session});
于 2013-01-21T15:16:27.317 に答える