我在一個WinRt項目中使用了RxUI,只是看到如果我能夠得到某些工作,我懷疑我所做的並不是一個有效的用例,但我想我會要求確定。使用RxUI可以訂閱KeyDown事件並根據條件防止輸入?
我有一個文本框綁定到一個屬性,我想訂閱keydown事件,並防止用戶輸入不適當的字符(在這種情況下,不是一個數字)。由於使用MVVM我沒有訪問文本框本身,只有綁定值。
這還能完成嗎? - 如果訂閱屬性發生變化,然後在不希望的情況下撤銷輸入,似乎有點奇怪。
我在一個WinRt項目中使用了RxUI,只是看到如果我能夠得到某些工作,我懷疑我所做的並不是一個有效的用例,但我想我會要求確定。使用RxUI可以訂閱KeyDown事件並根據條件防止輸入?
我有一個文本框綁定到一個屬性,我想訂閱keydown事件,並防止用戶輸入不適當的字符(在這種情況下,不是一個數字)。由於使用MVVM我沒有訪問文本框本身,只有綁定值。
這還能完成嗎? - 如果訂閱屬性發生變化,然後在不希望的情況下撤銷輸入,似乎有點奇怪。
這似乎是一個基於UI的關注,所以更加鬆耦合的方式是寫一個行爲類(基本上是一個附加屬性結合事件),並將其連接到文本框中的關注。
通過這種方式,您可以主動地過濾輸入,並且不具有特定於該文本框的代碼隱藏。
可能的表示:
<TextBox Text="{Binding...}">
<Interaction:Interaction.Behaviors>
<NumericTextBoxBehavior />
</Interaction:Interaction.Behaviors>
</TextBox>
看一看:
這就是我走的路,因爲我已經在使用一些「行爲」。很好地工作......謝謝。 – 4imble
僅僅因爲您使用的是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);
我不知道是否RxUI支持這個功能,但它聽起來就像你想控制視圖模型中的按鍵一樣。這聽起來更像是將交互邏輯封裝在控件或附加行爲中,只有您的視圖模型爲交互式代碼提供了可接受的文本格式。 –