我正在WinRt项目中尝试RxUI,只是想看看我是否能找到一些工作,我怀疑我所做的不是一个有效的用例,但我想我会要求确定。
我有一个绑定到属性的文本框,我想订阅keydown事件,并防止用户输入不合适的字符(在这种情况下,任何不是数字的字符)。由于使用MVVM,我无法访问文本框本身,只能访问绑定值。
这还能做到吗?-订阅已更改的属性,然后撤消它们的输入(如果不希望的话),这似乎有点奇怪。
这似乎是一个基于UI的问题,因此一种更松散耦合的方法是编写一个行为类(基本上是一个绑定事件的附加属性),并将其附加到问题中的文本框。
通过这种方式,您可以主动过滤输入,而不需要特定于该文本框的代码隐藏。
可能的表示:
<TextBox Text="{Binding...}">
<Interaction:Interaction.Behaviors>
<NumericTextBoxBehavior />
</Interaction:Interaction.Behaviors>
</TextBox>
看看:
- 行为模式
- 基于Regex进行筛选的文本框行为的代码
仅仅因为您使用MVVM,并不意味着您不能将代码放在View code Behind中。在这种情况下,我只会做最简单的事情:
theTextBox.PreviewKeyUp += (o,e) => {
if (!IsValidKey(e.Key)) e.Handled = true;
};
如果你不在乎,你也可以在事后在ViewModel中过滤它,这可能会导致插入符号问题,但更容易测试:
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);