我在 WinRt 项目中尝试使用 RxUI,只是看看我是否可以得到一些工作,我怀疑我正在做的不是一个有效的用例,但我想我会要求确定。
我有一个绑定到属性的文本框,我想订阅 keydown 事件并防止用户输入不适当的字符(在这种情况下,任何不是数字的字符)。由于使用 MVVM,我无法访问文本框本身,只能访问绑定值。
这还能做吗?- 订阅更改的属性然后撤消其输入似乎有点奇怪,如果它是不可取的。
我在 WinRt 项目中尝试使用 RxUI,只是看看我是否可以得到一些工作,我怀疑我正在做的不是一个有效的用例,但我想我会要求确定。
我有一个绑定到属性的文本框,我想订阅 keydown 事件并防止用户输入不适当的字符(在这种情况下,任何不是数字的字符)。由于使用 MVVM,我无法访问文本框本身,只能访问绑定值。
这还能做吗?- 订阅更改的属性然后撤消其输入似乎有点奇怪,如果它是不可取的。
这似乎是一个基于 UI 的问题,因此更松散耦合的方法是编写一个行为类(基本上是一个绑定事件的附加属性),并将其附加到相关的文本框。
通过这种方式,您可以主动过滤输入,并且没有特定于该文本框的代码隐藏。
可能的表示:
<TextBox Text="{Binding...}">
<Interaction:Interaction.Behaviors>
<NumericTextBoxBehavior />
</Interaction:Interaction.Behaviors>
</TextBox>
看一下:
仅仅因为您使用的是 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);