5

我有一个视图(X.Xaml),其中包含一些控件,包括CheckBox.

当我检查CheckBox它应该使会话True并且当我取消选中它时,它必须使会话False

如果我在X.Xaml.cs代码隐藏中这样做,那会很容易,但我希望我的代码是干净的。

无论如何在ViewModel端使用 Command 并处理它?

4

3 回答 3

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 回答
6

为什么不能简单地将 IsChecked-Property 上的 TwoWay-Binding 创建到 ViewModel-Property 并对该属性更改做出反应?

在视图模型中:

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 实现中响应 Property Change 会更加清晰。

于 2013-01-21T16:02:34.410 回答
0

您可以使用命令,也可以将数据绑定与更改通知一起使用。
在视图中只需绑定到复选框的命令属性。我只是调用命令更改。

Command={Binding Changed}"

视图模型

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