2017-02-13 14 views
1

キー押下イベントを処理する必要がある状況があります。これはA-Z、0-9のいずれでもかまいませんが、ViewModelで処理する必要があります。キーが押されたときは、ViewModelに渡す必要があります。私は、View1ViewModelがview1で自動配線されるように、プリズム6.0を使用しています。WPFでPrism 6を使用してViewModelでキープレスイベントを処理する方法は?

私は特定のキーについては扱うことができますが、すべてのキーで同じことを行う方法を知っています。

は私がViewModelに「KeyPressed」の性質を持っている、と私はコードビハインド

private void Window_PreviewKeyUp(object sender, KeyEventArgs e) 
{ 
    _mainWindowViewModel.KeyPressed = e.Key; 
} 

で以下のコードを試してみました。しかし、このコードは、プリズムのフレームワークのviewmodelのようView1ViewModelを更新しないと、結合が経由で見ます枠組み。 私はインタラクションを使用しようとしましたが、以下のコードをルートGridセクションに入れました。

<i:Interaction.Triggers > 
    <i:EventTrigger EventName="KeyUp"> 
     <i:InvokeCommandAction Command="{Binding KeyUpEventCommand}" 
     CommandParameter="..."/> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

イベントは発生しますが、コマンドパラメータがなくnullになります。私はcommandParameterを渡す必要がありますが、それが何であるべきか分かりません! ViewModelには

public DelegateCommand KeyUpEventCommand { get; private set; } 

private string strAlphabet; 
public string Alphabets 
{ 
    get { return strAlphabet; } 
    set { SetProperty(ref strAlphabet, value); } 
} 

public MainWindowViewModel(IEventAggregator eventAggregator) 
{ 
    KeyUpEventCommand = new DelegateCommand(KeyUpEventHandler); 
} 

public void KeyUpEventHandler() 
{ 
    //This logic can be changed 
    if (Alphabets == "A") 
    { 
     // Perform some action 
    } 
    if (Alphabets == "B") 
    { 
     // Perform some other action 
    } 
} 

任意のアイデア/提案どのように私はこれを扱うことができますか?

+0

をお試しください何が起こるのですか? PreviewKeyUpイベントハンドラが呼び出されますが、ビューモデルのKeyPressedプロパティの設定が呼び出されないか、何が呼び出されませんか? – mm8

+0

質問を更新しましたが、KeyUpEventCommandは起動しましたが、キープレスの値は含まれていません。 – Debhere

+0

ビューモデルクラスのKeyUpEventCommandはどのようにして正確に定義されていますか? – mm8

答えて

2

コマンドプロパティのタイプはDelegateCommand<KeyEventArgs>次のようになります。

public DelegateCommand<KeyEventArgs> KeyUpEventCommand { get; private set; } 

private string strAlphabet; 
public string Alphabets 
{ 
    get { return strAlphabet; } 
    set { SetProperty(ref strAlphabet, value); } 
} 

public MainWindowViewModel(IEventAggregator eventAggregator) 
{ 
    KeyUpEventCommand = new DelegateCommand<KeyEventArgs>(KeyUpEventHandler); 
} 

public void KeyUpEventHandler(KeyEventArgs args) 
{ 
    //... 
} 

はまた、あなたがプリズムの独自InvokeCommandActionクラスを使用していて、それのCommandParameterプロパティを設定しないことを確認してください:

xmlns:prism="http://prismlibrary.com/" 
... 
<i:Interaction.Triggers > 
    <i:EventTrigger EventName="PreviewKeyDown"> 
     <prism:InvokeCommandAction Command="{Binding KeyUpEventCommand}" /> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

KeyEventArgsは、デフォルトでコマンドパラメータとして渡す必要があります。

+0

完璧!これは私が必要としていたものです。答えに感謝します。しかし、あなたはプリズムの理由をいくつか挙げることができますか:私は他のいくつかのキーを使用するとInvokeCommandActionが起動しません。最初にAを押し、次にBとCを押したいとします...キーを押すたびにKeyUpEventCommandを実行する必要があります。しかし、これは起こっていない。 – Debhere

+1

Blend SDKの一部であるこのクラスは、EventArgsをコマンドに渡すことをサポートしていないためです。 – mm8

+0

ありがとうございました。 – Debhere

0

意味を正確に何をして "View1ViewModelを更新しない" のでしょうか?KeyTriger

<i:Interaction.Triggers> 
     <ei:KeyTrigger Key="Escape"> 
      <i:InvokeCommandAction Command="{Binding KeyDownCommand}" /> 
     </ei:KeyTrigger> 
    </i:Interaction.Triggers> 





public ICommand KeyDownCommand 
    { 
     get { return new RelayCommand(KeyboardKeyDownCommand, true); } 
    } 

    private void KeyboardKeyDownCommand() 
    { 
     ///code 
    } 
関連する問題