使用RxUI可以订阅KeyDown事件并根据条件阻止输入吗?

时间:2012-09-05 13:54:38

标签: windows-runtime system.reactive reactiveui

我正在WinRt项目中使用RxUI,只是看看我是否可以得到一些工作,我怀疑我正在做的不是一个有效的用例,但我想我会确定。

我有一个绑定到属性的文本框,我想订阅keydown事件并阻止用户输入不适当的字符(在这种情况下,任何不是数字的东西)。由于使用MVVM,我无法访问文本框本身,只能访问绑定值。

这仍然可以吗? - 订阅属性改变然后撤消他们的输入似乎有点奇怪,如果这是不合需要的。

2 个答案:

答案 0 :(得分:4)

这似乎是基于UI的关注点,因此更松散耦合的方法是编写行为类(基本上是绑定事件的附加属性),并将其附加到所关注的文本框中。

通过这种方式,您可以主动过滤输入,而不是特定于该文本框的代码隐藏。

可能的代表:

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

看看:

答案 1 :(得分:2)

仅仅因为您使用的是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);