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 に答える