Windows runtime 使用RxUI,您可以订阅KeyDown事件并根据条件阻止输入吗?
我正在WinRt项目中尝试RxUI,只是想看看我是否能做点什么,我怀疑我所做的不是一个有效的用例,但我想我会要求确定 我有一个绑定到属性的文本框,我想订阅keydown事件并防止用户输入不适当的字符(在本例中,任何不是数字的字符)。由于使用MVVM,我无法访问文本框本身,只能访问绑定值Windows runtime 使用RxUI,您可以订阅KeyDown事件并根据条件阻止输入吗?,windows-runtime,system.reactive,reactiveui,Windows Runtime,System.reactive,Reactiveui,我正在WinRt项目中尝试RxUI,只是想看看我是否能做点什么,我怀疑我所做的不是一个有效的用例,但我想我会要求确定 我有一个绑定到属性的文本框,我想订阅keydown事件并防止用户输入不适当的字符(在本例中,任何不是数字的字符)。由于使用MVVM,我无法访问文本框本身,只能访问绑定值 还可以这样做吗订阅已更改的属性,然后撤消它们的输入(如果不需要的话),这似乎有点奇怪。仅仅因为您使用的是MVVM,并不意味着您不能将代码放在视图中。在这种情况下,我只做最简单的事情: theTextBox.Pre
还可以这样做吗订阅已更改的属性,然后撤消它们的输入(如果不需要的话),这似乎有点奇怪。仅仅因为您使用的是MVVM,并不意味着您不能将代码放在视图中。在这种情况下,我只做最简单的事情:
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);
仅仅因为您使用的是MVVM,并不意味着您不能将代码放在视图中,代码隐藏。在这种情况下,我只做最简单的事情:
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);
这似乎是一个基于UI的关注点,因此更松散耦合的方法是编写一个行为类(基本上是绑定事件的附加属性),并将其附加到关注的文本框 通过这种方式,您可以主动过滤输入,而不必隐藏特定于该文本框的代码 可能的代表:
<TextBox Text="{Binding...}">
<Interaction:Interaction.Behaviors>
<NumericTextBoxBehavior />
</Interaction:Interaction.Behaviors>
</TextBox>
看看:
<TextBox Text="{Binding...}">
<Interaction:Interaction.Behaviors>
<NumericTextBoxBehavior />
</Interaction:Interaction.Behaviors>
</TextBox>
看看: