1

基本的に、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' のコレクションまたはディクショナリに追加できません。

少し困惑!

コマンドでやろうとしていることを行う方法はありますか、それとも分離コードのみのオプションですか?

ありがとう

4

1 に答える 1