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にあなたの行動を処理しないのはなぜ
Damir、これは良い提案です。何らかの理由で、私はセッターの後に発せられた変更された通知で仕事をすることは考えていませんでした。 –
ジョージ、私の意見では、いくつかのチェックボックスがチェックされているかどうかを確認するために2つのコマンドを作成するのが最善の方法ではありません。あなたができることは、ViewModelプロパティを変更したコンストラクタに登録したクラスを作成することです。次に、プロパティ名がIs24Hourであるかどうかを調べ、それがあなたのviewmodelで動作するかどうかを調べます。そのクラスはあなたのViewModelをコンストラクタに入れ、新しいSomeIs24HourService(this)のようにViewModelコンストラクタで作成しなければなりません。そのようにして、あなたはあなたのビューモデルを操作することができ、その機能を切り離しました。 –