在Silverlight中检查/取消选中CheckBox的MVVM-Light EventToCommand行为

时间:2011-01-10 14:24:09

标签: silverlight-4.0 mvvm-light

我想处理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代码更脏:)

由于

3 个答案:

答案 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}