基本的に、WPF コントロールによって発生したイベントに応答しようとしていますが、コード ビハインドを使用する代わりに、代わりにコマンド (ICommand) を実行します。
CouponView という Window と SingleBetView という UserControl があります。CouponView の DataContext である CouponViewModel という ViewModel と、SingleBetView の DataContext である BetsViewModel という ViewModel があります。SingleBetView を CouponView に追加し、次のように DataContext に設定しています。
<View:SingleBetView DataContext="{Binding Path=BetsViewModel}" />
SingleBetView には DataGrid が含まれており、このグリッドの KeyDown イベントに応答したいと考えています。DownArrowRepeatsStakesCommand という Command クラスを作成し、このインスタンスを BetsViewModel 内に次のように配置しました。
public DownArrowRepeatsStakesCommand DownArrowRepeatsStakesCommand { get; set; }
次に、BetsViewModel のコンストラクター内で次のようにインスタンス化します。
DownArrowRepeatsStakesCommand = new DownArrowRepeatsStakesCommand(_bets); //_bets is an observable collection, my DataGridView is bound to this ObservableCollection and when the KeyDown is pressed, I want to update various elements
次のように ViewModel のインスタンスにボタンをバインドするだけで、ボタンを Command に簡単にリンクできることがわかりました。
Command="{Binding DownArrowRepeatsStakesCommand}"
しかし、同じことがイベントへの応答には機能しないようです:
KeyDown="{Binding DownArrowRepeatsStakesCommand}
次のランタイム エラーが発生します。
A 'Binding' cannot be set on the 'AddKeyDownHandler' property of type 'DataGrid'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.
MVVMライト(NuGet経由で追加)を使用するというReedの提案と、ここにある手順を試してみましたが、理論的には素晴らしいですが、以下のエラーが発生しました:
ファイルまたはアセンブリ 'GalaSoft.MvvmLight.Extras.WPF4, PublicKeyToken=1673db7d5906b0ad' またはその依存関係の 1 つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。
DataGrid に追加した XAML は次のとおりです。
<i:Interaction.Triggers>
<i:EventTrigger EventName="KeyUp">
<command:EventToCommand Command="{Binding DownArrowRepeatsStakesCommand, Mode=OneWay}" />
</i:EventTrigger>
</i:Interaction.Triggers>
スクリーンショットを次に示します (内部例外はありません)。
次の 2 つの警告も表示されます。
- タイプ 'EventTrigger' のインスタンスをタイプ 'TriggerCollection' のコレクションに追加できません。タイプ「T」のアイテムのみが許可されます。
- タイプ 'EventTrigger' の値は、タイプ 'TriggerCollection' のコレクションまたはディクショナリに追加できません。
少し困惑!
コマンドでやろうとしていることを行う方法はありますか、それとも分離コードのみのオプションですか?
ありがとう