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



我正在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);

相关内容

  • 没有找到相关文章

最新更新