2011-01-10 7 views
1

CheckboxコントロールのCheckedイベントとUncheckedイベントを処理し、ViewModelでコマンドを実行したいと思います。 MVVM-Light CheckBoxのEventToCommand動作Silverlightでチェック/チェックされていない

<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を定義し、それに対するアクションを有線:次のように私は両方のチェックや未確認のイベントのためにEventTriggerを有線

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

この現象は予期しないものですか?

チェックとアンチェックのトリガー(とコマンド)を別々にして、RelayCommand<bool>の代わりにRelayCommandを使用して回避する方法があります。各コマンドは、CheckBoxがチェックされ、チェックが外されたときに正しく実行されます。私のViewModelにUIコードを持つよりも、汚れ:)

おかげで、あなたのSchedule.Is24Hourにあなたの行動を処理しないのはなぜ

答えて

0

- しかし少し汚れを感じています。セッターでは、そのプロパティーがいつ変更されるかを常に確認できます。

+0

Damir、これは良い提案です。何らかの理由で、私はセッターの後に発せられた変更された通知で仕事をすることは考えていませんでした。 –

+0

ジョージ、私の意見では、いくつかのチェックボックスがチェックされているかどうかを確認するために2つのコマンドを作成するのが最善の方法ではありません。あなたができることは、ViewModelプロパティを変更したコンストラクタに登録したクラスを作成することです。次に、プロパティ名がIs24Hourであるかどうかを調べ、それがあなたのviewmodelで動作するかどうかを調べます。そのクラスはあなたのViewModelをコンストラクタに入れ、新しいSomeIs24HourService(this)のようにViewModelコンストラクタで作成しなければなりません。そのようにして、あなたはあなたのビューモデルを操作することができ、その機能を切り離しました。 –

4

「チェック済み」または「未チェック」の代わりに「クリック」イベントを使用すると、1つのコマンドだけでこのコードが追加コードなしで解決できると思います。 XAMLで は、それはあなたのコードの残りの部分は、あなたが望んでいた、

おかげで、

0

私はビュー

のチェックボックス

をチェックするためにこれを行うに動作するはずです、今

<i:EventTrigger EventName="Click"> 
<GalaSoft_MvvmLight_Command:EventToCommand CommandParameter="{Binding IsChecked, ElementName=chkIsExtendedHr}" Command="{Binding Path=SetCloseTime, Mode=OneWay}" /> 
</i:EventTrigger> 

、のようになります。

<CheckBox Margin="126,0,0,0" IsChecked="{Binding UseNOCODE, Mode=TwoWay}" Content="Reply Messages ?" /> 

for the modelview

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} 
関連する問題