2013-04-15 159 views
1

我想知道如何在ViewModel中使用MVVM處理KeyDown事件。Mvvm TextBox KeyDown事件

我有一個文本框,當用戶點擊一個不是數字的鍵時,輸入不應該被允許。我通常用代碼來執行它背後是這樣的(不完整的代碼,只是一個簡單的例子):

private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) 
{ 

    // Determine whether the keystroke is a number from the top of the keyboard. 
    if (e.KeyCode < Keys.D0 || e.KeyCode > Keys.D9) 
    { 
     e.Handled = true; 
    } 
} 

現在,我想在我的視圖模型用Command莫名其妙地把這個。我是MVVM的新手,我現在只使用Bindings(它工作正常:)),但我不知道如何使用命令...

我的文本框看起來像這樣:

<TextBox Text="{Binding MyField, Mode=TwoWay}"/> 

視圖模型:

private string _myfield; 
public string MyField{ 
    get { return _myfield; } 
    set { 
    _myfield= value; 
    RaisePropertyChanged(()=>MyField) 
    } 
} 

但二傳手纔會被調用,當我離開的文本框+我沒有進入進入關鍵。

+0

可能重複:http://stackoverflow.com/questions/612966/keyboard-events-in-a-wpf-mvvm-application – walther

+0

謝謝。另一個問題:我點擊我的TextBox,這是否也會引發GotFocus事件?我有一個標準值爲0.00的小數文本框。當我點擊文本框時,該值應爲「」(如果值爲0.00,則在文本框中)。我發現UpdateSourceTrigger會在每次鍵入內容時都會引發我的setter,並且我將不得不根據輸入檢查/設置值...無論如何,「KeyDown」正在工作,但GotFocus如何? PS:上面的問題顯示瞭如何在單擊某個鍵時引發事件,但我想處理所有KeyDown事件而不是特殊鍵。 (沒有後面代碼) – Rudi

回答

3

我這樣做是通過使用交互觸發器。 (本例使用MVVM_Light框架命令綁定)

這裏有一個例子:

<textBox Text="{Binding MyField}"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="KeyDown"> 
      <cmd:EventToCommand Command="{Binding MyCommandName}" CommandParameter="YouCommandParameter"/> 
     </i:EventTrigger> 
     </i:Interaction.Triggers> 
<TextBox/> 

在名爲MyCommandName您的視圖模型創建的ICommand對象,並把它們添加到您的XAML的頂部:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
xmlns:cmd="http://www.galasoft.ch/mvvmlight" 

您不必使用mvvm-light命令。這是我使用的正是我喜歡它,因爲它可以讓我使用ICommand接口

希望這有助於

5

的CanExecute方法,我知道我的回答是遲,但如果有人有類似的問題。你必須只設置你的文本是這樣的:

<TextBox Text="{Binding MyField, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
+0

這是偉大而簡單的。爲了擴大這一點,我發現了關於它是如何工作的以下附加信息:https://www.codeproject.com/Articles/507883/UpdateSourceTrigger-Property-in-WPF-Binding。好東西,謝謝! – gbdavid

1

用於處理在TextBox的 「Enter」 鍵下面的工作:

<TextBox Text="{Binding UploadNumber, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> 
    <TextBox.InputBindings> 
     <KeyBinding 
      Key="Enter" 
      Command="{Binding FindUploadCommand}" /> 
    </TextBox.InputBindings> 
</TextBox>