2012-09-05 34 views
0

我在一個WinRt項目中使用了RxUI,只是看到如果我能夠得到某些工作,我懷疑我所做的並不是一個有效的用例,但我想我會要求確定。使用RxUI可以訂閱KeyDown事件並根據條件防止輸入?

我有一個文本框綁定到一個屬性,我想訂閱keydown事件,並防止用戶輸入不適當的字符(在這種情況下,不是一個數字)。由於使用MVVM我沒有訪問文本框本身,只有綁定值。

這還能完成嗎? - 如果訂閱屬性發生變化,然後在不希望的情況下撤銷輸入,似乎有點奇怪。

+1

我不知道是否RxUI支持這個功能,但它聽起來就像你想控制視圖模型中的按鍵一樣。這聽起來更像是將交互邏輯封裝在控件或附加行爲中,只有您的視圖模型爲交互式代碼提供了可接受的文本格式。 –

回答

4

這似乎是一個基於UI的關注,所以更加鬆耦合的方式是寫一個行爲類(基本上是一個附加屬性結合事件),並將其連接到文本框中的關注。

通過這種方式,您可以主動地過濾輸入,並且不具有特定於該文本框的代碼隱藏。

可能的表示:

   <TextBox Text="{Binding...}"> 
       <Interaction:Interaction.Behaviors> 
       <NumericTextBoxBehavior /> 
       </Interaction:Interaction.Behaviors> 
      </TextBox> 

看一看:

+0

這就是我走的路,因爲我已經在使用一些「行爲」。很好地工作......謝謝。 – 4imble

2

僅僅因爲您使用的是MVVM,並不意味着您無法將代碼放在View Code-Behind中。在這種情況下,我只希望做最簡單的事情:

theTextBox.PreviewKeyUp += (o,e) => { 
    if (!IsValidKey(e.Key)) e.Handled = true; 
}; 

如果你不喜歡,你也可以在事實後使其過濾的視圖模型,這可能會導致插入符號的問題,但更可檢驗:

this.WhenAny(x => x.SomeProp, x => x.Value) 
    .Select(x => new { Filtered = FilterAllInvalidChars(x), Original = x}) 
    .Where(x => x.Filtered != x.Original) 
    .Subscribe(x => SomeProp = x.Filtered);