0

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

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

这还能做吗?- 订阅更改的属性然后撤消其输入似乎有点奇怪,如果它是不可取的。

4

2 回答 2

4

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

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

可能的表示:

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

看一下:

于 2012-09-05T21:33:52.860 回答
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);
于 2012-09-05T19:53:36.260 回答