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

Windows runtime 使用RxUI,您可以订阅KeyDown事件并根据条件阻止输入吗?,windows-runtime,system.reactive,reactiveui,Windows Runtime,System.reactive,Reactiveui,我正在WinRt项目中尝试RxUI,只是想看看我是否能做点什么,我怀疑我所做的不是一个有效的用例,但我想我会要求确定 我有一个绑定到属性的文本框,我想订阅keydown事件并防止用户输入不适当的字符(在本例中,任何不是数字的字符)。由于使用MVVM,我无法访问文本框本身,只能访问绑定值 还可以这样做吗订阅已更改的属性,然后撤消它们的输入(如果不需要的话),这似乎有点奇怪。仅仅因为您使用的是MVVM,并不意味着您不能将代码放在视图中。在这种情况下,我只做最简单的事情: theTextBox.Pre

我正在WinRt项目中尝试RxUI,只是想看看我是否能做点什么,我怀疑我所做的不是一个有效的用例,但我想我会要求确定

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


还可以这样做吗订阅已更改的属性,然后撤消它们的输入(如果不需要的话),这似乎有点奇怪。

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

看看:


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

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

可能的代表:

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

看看:


我不知道RxUI是否支持此功能,但听起来您希望控制视图模型中的按键。这听起来更像是将交互逻辑封装在控件或附加行为中,只让视图模型为交互代码提供可接受的文本格式。我不知道RxUI是否支持这一点,但听起来像是要控制视图模型中的按键。这听起来更像是将交互逻辑封装在控件或附加的行为中,只让视图模型为交互代码提供可接受的文本格式。这就是我的做法,因为我已经在使用一些“行为”。工作得很好。。。谢谢。这就是我的方式,因为我已经在使用一些“行为”。工作得很好。。。谢谢