我有一个复选框,如果复选框改变了,我想运行我的方法OnCheckBoxChanged
,现在我这样做:
<CheckBox x:Name="myCheckBox"
Content="Run my command"
IsChecked="SetMyCheckBoxState"
Checked="OnCheckBoxChanged"
Unchecked="OnCheckBoxChanged"/>
和后面的代码:
private void SetMyCheckBoxState()
{
return Helper.GetState();
}
private void OnCheckBoxChanged(object sender, RoutedEventArgs e)
{
if (myCheckBox.IsChecked)
//my logic 1
else
//my logic 2
}
我想用MVVM的样式来做,就像这样:
public static class Helper
{
public static bool GetState()
{
var state = //My logic;
return state;
}
public static void OnCheckBoxChanged(bool state)
{
if (state)
//my logic 1
else
//my logic 2
}
}
代码xaml应该是这样的:
<CheckBox x:Name="myCheckBox"
Content="Run my command"
IsChecked="{Binding Path=Helper.GetState(), Mode=TwoWay}"
Checked="{Binding Path=Helper.OnCheckBoxChanged(How to pass a state here ?)}"
Unchecked="{Binding Path=Helper.OnCheckBoxChanged()}"/>
我的问题是如何将复选框状态传递给Checked="{Binding Path=Helper.OnCheckBoxChanged(How to pass a state here ?)}"
如何让它工作,我在这里错过了什么?
可以使用布尔属性绑定复选框的IsChecked
private bool _isSelected;
public bool IsSelected{
get { return _isSelected; }
set {
if(_isSelected == value) return;
_isSelected = value;
NotifyPropertyChanged(()=> IsSelected);
}
}
你可以将这个属性绑定到IsChecked它会给你视图模型中的复选框状态
我假设你知道MVVM是如何工作的。假设你的CheckBox DataContext是你的ViewModel。然后:
在ViewModel:private bool state;
public bool State
{
get
{
return state;
}
set
{
state = value;
OnCheckBoxChanged(value);
OnPropertyChanged("State");
}
}
在XAML中:
<CheckBox x:Name="myCheckBox"
Content="Run my command"
IsChecked="{Binding Path=State, Mode=TwoWay}" />
如果你要使用mvvm样式,那么你真的不应该在视图中调用方法。相反,您应该绑定到属性。对于你的复选框:
<CheckBox Content="Run my command" IsChecked="{Binding Path=IsCheckBoxTicked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
和视图模型中的属性:
public bool IsCheckBoxTicked
{
get { return _isCheckBoxTicked;}
set { _isCheckBoxTicked = value;
RaisePropertyChanged(IsCheckBoxTicked);
//run any methods you want here.
}
这个想法是当你改变复选框的值时,视图将通知视图模型并更新属性。
注意:你需要查找如何实现INotifyPropertyChanged到你的视图模型