4

最近、 MVVM Lightでアプリケーションに取り組んでいます。UIにバインドされたXAMLにTextBoxがあります。入力を検証し、数字のみが入力されていることを確認したいと思います。私は次のコードを試しました:

私のテキストボックス

<TextBox TabIndex="1" Height="23" MinWidth="410" DockPanel.Dock="Left" 
         HorizontalAlignment="Left"
         Text="{Binding Input, UpdateSourceTrigger=PropertyChanged}" 
         IsEnabled="{Binding IsEnabled}"
         AcceptsReturn="False"
         local:FocusExtension.IsFocused="{Binding IsFocused}">

そして私のViewModelで:

private string input;
public string Input
{
    get { return this.input; }
    set
    {
        decimal test;
        if(decimal.TryParse(value, out test))
        {
            this.input = value;
        }
        else
        {
            this.input = "";
        }

        RaisePropertyChanged("Input");
    }
}

これはUIの更新に失敗します。「B」と入力してデバッガーを確認すると、セッターを介して実行されますが、実際にはUIを更新できません。

奇妙なことにthis.input = "TEST";、else ブロックに設定すると更新されますが、検証前に""string.Empty、または入力の値にUI設定しようとすると、 UIの更新に失敗します。

これは設計によるものですか?もしかしてバグ?私が間違っていることはありますか?

編集RaisePropertyChangedサンプルコードに含めるのを誤って忘れました。更新しました。デバッガーがそれを上げてゲッターを介して入力を返すまでずっと実行されているのを見たので、それを上げることは問題ではありません。

4

2 に答える 2

0

通貨テキスト ボックスに使用するため、カスタム コントロールを作成しました。コントロールのすべての操作はコード ビハインドで行われるため、これが良いアイデアである、または MVVM モデルと一致するという検証がないことを警告します。

テキスト ボックスのコントロールには、これを行う PreviewTextInput のイベントがあります。

e.Handled = Functions.DoubleConverter(Convert.ToChar(e.Text), ((TextBox)sender).Text.Replace("$", ""));

次に、関数(完璧ではありませんが、まだいくつか問題があります)は次のとおりです。

static public bool DoubleConverter(char c, string str)
{
    if (!char.IsDigit(c))
    {
        if (c == '.' && (str.Contains('.')))
        {
            return true;
        }
        else if (c != '.')
        {
            return true;
        }
    }
    return false;
}

これは非常に大まかな実装であるため、そのままではなく参考として使用してください。

于 2013-11-02T19:07:51.877 に答える
0

strign 型のプロパティを使用してから 10 進数に変換すると、次のように簡単に変更できます。

public decimal Input
{
    get { return this.input; }
    set 
        { 
          this.input = value;
         RaisePropertyChanged("Input");
      } 
}

検証には IDataErrorInfo を使用します (詳細: http://blogs.msdn.com/b/wpfsdk/archive/2007/10/02/data-validation-in-3-5.aspxを参照) 。

于 2013-11-01T20:24:35.410 に答える