我想处理Checkbox控件的Checked和Unchecked事件,并在我的ViewModel中执行命令。我为Checked和Unchecked事件连接了一个EventTrigger,如下所示:
<CheckBox x:Name="chkIsExtendedHr" IsChecked="{Binding Schedule.Is24Hour, Mode=TwoWay}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Checked">
<GalaSoft_MvvmLight_Command:EventToCommand
CommandParameter="{Binding IsChecked, ElementName=chkIsExtendedHr}"
Command="{Binding Path=SetCloseTime, Mode=OneWay}" />
</i:EventTrigger>
<i:EventTrigger EventName="Unchecked">
<GalaSoft_MvvmLight_Command:EventToCommand
CommandParameter="{Binding IsChecked, ElementName=chkIsExtendedHr}"
Command="{Binding Path=SetCloseTime, Mode=OneWay}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</CheckBox>
我在我的ViewModel中定义了一个RelayCommand并为它连接了一个动作:
public RelayCommand<Boolean> SetCloseTime{ get; private set; }
...
SetCloseTime= new RelayCommand<bool>(ExecuteSetCloseTime);
该命令的操作中的参数始终解析为CheckBox的先前状态,例如选中CheckBox时为false,取消选中CheckBox时为true。
void ExecuteSetCloseTime(bool isChecked)
{
if (isChecked)
{
// do something
}
}
这是预期的行为吗?
我有一个解决方法,我为Checked和Unchecked设置了单独的触发器(和命令),并使用RelayCommand
代替RelayCommand<bool>
。选中并取消选中CheckBox时,每个命令都会正确执行。虽然感觉有点脏 - 比在我的ViewModel中使用UI代码更脏:)
由于
答案 0 :(得分:4)
我认为使用“Click”事件而不是“Checked”或“UnChecked”只需一个命令就可以解决这个问题而不需要额外的代码。 在XAML中,它看起来像,
<i:EventTrigger EventName="Click">
<GalaSoft_MvvmLight_Command:EventToCommand CommandParameter="{Binding IsChecked, ElementName=chkIsExtendedHr}" Command="{Binding Path=SetCloseTime, Mode=OneWay}" />
</i:EventTrigger>
现在你们其余的代码应该按你想要的那样工作,
感谢,
答案 1 :(得分:0)
为什么不在你的Schedule.Is24Hour中处理你的行为。在setter中,您始终可以看到该属性何时更改。
答案 2 :(得分:0)
我这样做是为了检查复选框
for view
<CheckBox Margin="126,0,0,0" IsChecked="{Binding UseNOCODE, Mode=TwoWay}" Content="Reply Messages ?" />
用于模型视图
private bool _useNOCODE = false;
public bool UseNOCODE
{
get
{
return _useNOCODE;
}
set
{
if (_useNOCODE == value)
{
return;
}
_useNOCODE = value;
RaisePropertyChanged("UseNOCODE");
UseNoCodeChecked();
}
}
private void UseNoCodeChecked()
{//check the properties and what you like}