CanexecuteとCanexectechanged、私はこれらをRelayCommandで実装する必要がありますか?
-
28-10-2019 - |
質問
私はMVVM-lightを使用していて、リレーコマンドを完全に動作させています。実装する必要があることを読んでいます CanExecuteChanged
と CanExecute
. 。良い例を見つけることができませんが。
誰かがこれらを実装する方法の良い例を持っていますか?
Canexecuteは、実行できないときにfalseを返す必要がありますが、ボタンをディスベールするだけではありませんか?
いつ実行できますか CanExecuteChanged
?
誰もがそれぞれを使用する時期の良い例を持っています、私のコードはなしで機能します このブログ Postは、これらのアイテムを実装する必要があると述べています。
私はちょうどバインドするだろうと思ったと言ったので、私は少し混乱しています Enabled
ViewModel内のプロパティまたはプロパティへの何か、ボタンや同様のコントロールを無効にすることができますか?
理解の助けは本当に感謝しています。
編集
これは私が今持っているものです...その動作ですが、ボタンは物理的に無効にされていません。私が虚偽を返しているので、コマンドだけが実行されません。私はコンストラクターのCanExecutemeを呼び出して、RaisecanexeCuteChangedを強制的に走らせるようにしています...
これは、私のviewmodelの制約で実行されます
this.Page2Command = new RelayCommand(() => this.GoToPage2(), () => CanExecuteMe);
CanExecuteMe = false;
そして、これが私のコードの残りの部分です、私はそれを例から取りました。
private bool _canIncrement = true;
public bool CanExecuteMe
{
get
{
return _canIncrement;
}
set
{
if (_canIncrement == value)
{
return;
}
_canIncrement = value;
// Update bindings, no broadcast
//RaisePropertyChanged(CanIncrementPropertyName);
Page2Command.RaiseCanExecuteChanged();
}
}
public RelayCommand Page2Command
{
get;
private set;
}
private object GoToPage2()
{
System.Windows.MessageBox.Show("Navigate to Page 2!");
return null;
}
そして、これが私のXamlです
<Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="31,77,0,0" x:Name="button1" VerticalAlignment="Top" Width="75" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding Page2Command, Mode=OneWay}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
解決
Canexecuteは、ボタンが有効にする必要があるかどうかを判断する必要があるときに呼び出されます。
ボタンは、バインディングでこれを行い、毎回CanexecteChanged Seed(ボタンがこのイベントを聴き、その指揮を挙げます)。
したがって、ボタンを無効にする必要がある場合は、CanExeCteChangedを発射する必要があります。 false
. 。これは、コマンドバインディングを使用するときにボタンを有効/無効にするという好ましい方法です。
コマンドバインディングを使用すると、インスタンス(コマンド)内のすべてのボタンロジックをカプセル化できます。 Canexecuteメソッドは、アプリケーションの現在の状態を照会して、ボタンを有効にするか無効にするかを判断する必要があります。このカプセル化により、ビューモデルのスパゲッティコードを削減します。これらのチェックはあちこちで実行され、あちこちで実行され、私はそこにそれを忘れていました。
他のヒント
Canexecute Predicateを使用して非常に注意する必要があります。すべてのUI変更をチェックし、すべてのフィールドに入力されたキーボードキーごとにチェックします。
これはパフォーマンスの問題を引き起こす可能性があります!