2017-02-13 212 views
1

我有一種情況,我需要處理按鍵事件,它可以是任何從A-Z,0-9,但我需要在ViewModel中處理。按下哪個鍵應該傳遞給ViewModel。我使用的是棱鏡6.0,所以View1ViewModel與視圖1自動連線。如何使用WPF中的Prism 6處理ViewModel中的按鍵事件?

我知道我可以處理特定的按鍵,但是如何對所有按鍵都做同樣的操作。

我在視圖模型「的keyPressed」的屬性,我試圖在代碼隱藏

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

下面的代碼,但是這個代碼不更新View1ViewModel在棱鏡框架視圖模型和視圖綁定是通過該框架。 我試圖使用交互,我把下面的代碼放在根Grid部分。

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

該事件被觸發,但因爲沒有Command參數,所以它爲空。我需要傳遞一個commandParameter,但不知道它應該是什麼!

在視圖模型:

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

到底是什麼 「不更新View1ViewModel」 是什麼意思?怎麼了? PreviewKeyUp事件處理程序是否被調用,但視圖模型的KeyPressed屬性的setter不會被調用或什麼? – 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

嘗試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 
    } 
相關問題