我有一个视图(X.Xaml),其中包含一些控件,包括CheckBox
.
当我检查CheckBox
它应该使会话True并且当我取消选中它时,它必须使会话False。
如果我在X.Xaml.cs
代码隐藏中这样做,那会很容易,但我希望我的代码是干净的。
无论如何在ViewModel端使用 Command 并处理它?
我有一个视图(X.Xaml),其中包含一些控件,包括CheckBox
.
当我检查CheckBox
它应该使会话True并且当我取消选中它时,它必须使会话False。
如果我在X.Xaml.cs
代码隐藏中这样做,那会很容易,但我希望我的代码是干净的。
无论如何在ViewModel端使用 Command 并处理它?
回答你的问题:是的,有。
您必须创建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 中创建相应的属性,绑定到它并在访问器中调用所需的代码。
为什么不能简单地将 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 会更加清晰。
您可以使用命令,也可以将数据绑定与更改通知一起使用。
在视图中只需绑定到复选框的命令属性。我只是调用命令更改。
Command={Binding Changed}"
视图模型
bool session = false;
RelayCommand Changed = new RelayCommand(()=>{this.session = !this.session});