如何在Silverlight的ViewModel中使用Command处理Checkbox Checked / Unchecked事件?

时间:2013-01-21 14:56:28

标签: c# silverlight

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

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

如果我在X.Xaml.cs代码隐藏中执行此操作,那将很容易,但我希望我的代码干净。

无论如何使用Command并在 ViewModel 方面处理它?<​​/ p>

3 个答案:

答案 0 :(得分:6)

为什么不能简单地在IsChecked-Property上创建一个ViewWodel-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实现中的Property Change会更加清晰。

答案 1 :(得分:5)

回答你的问题:是的,有。

您必须创建实施Command的{​​{1}}类:

ICommand

然后在您的ViewModel中创建命令本身:

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);
    }
}

并将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

但这有点夸张。你可能最好在ViewModel中创建相应的<CheckBox Name="checkBox1" Command="{Binding Path=SimpleCommand}" CommandParameter="{Binding ElementName=checkBox1, Path=IsChecked}" /> 属性,绑定它并在访问器中调用所需的代码。

答案 2 :(得分:0)

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

Command={Binding Changed}"

视图模型

bool session = false;
RelayCommand Changed = new RelayCommand(()=>{this.session = !this.session});