5

ではWPFTextBoxユーザー入力を検証して、doubleに解析される入力のみを許可するようにします。ボックスがフォーカス(およびBinding更新)を失ったときに、ユーザーが無効な入力を入力した場合、ボックスを以前の状態に戻したいと思います。

これは単純なはずですが、動作させることができません。私が何を試しTextBoxても、プロパティが入力を適切に検証し、有効でない限り保存しない場合でも、ユーザーが入力した無効な文字列を表示し続けます。解析が失敗したときにプロパティが変更されたことを通知するTextBoxと、が古い値にリセットされるように感じますが、そうではありません。

私のビューモデルには次のプロパティがあります。

private double _doubleDisplayValue;
public string DoubleDisplayValue
{
    get { return _doubleDisplayValue.ToString(); }
    set
    {
        double result;
        bool success = double.TryParse(value, out result);
        if(success)
        {
            if(_doubleDisplayValue != result)
            {
                _doubleDisplayValue = result;
                NotifyPropertyChanged("DoubleDisplayValue");
            }
        }
        else
        {
            // I feel like notifying property changed here should make the TextBox
            // update back to the old value (still in the backing variable), but
            // it just keeps whatever invalid string the user entered.
            NotifyPropertyChanged("DoubleDisplayValue");
        }
    }   
}

そして、私は自分のTextBox(コードビハインドで作業しています)を設定しました:

// . . .
TextBox textBox = new TextBox();
Binding b = new Binding("DoubleDisplayValue");
b.Mode = BindingMode.TwoWay;
// assume the DataContext is properly set so the Binding has the right source
textBox.SetBinding(TextBox.TextProperty, b);
// . . .

プロパティをこれに変更しようとしましたが、それでも機能しません。

private double _doubleDisplayValue;
public string DoubleDisplayValue
{
    get { return _doubleDisplayValue.ToString(); }
    set
    {
        double result;
        bool success = double.TryParse(value, out result);
        if(success)
        {
            // got rid of the if
            _doubleDisplayValue = result;
            NotifyPropertyChanged("DoubleDisplayValue");                
        }
        else
        {
            // Figured maybe I need to retrigger the setter
            DoubleDisplayValue = _doubleDisplayValue;
        }
    }   
}

私の目標を達成するための最良の方法は何ですか?

4

2 に答える 2

4

TextBoxに表示されている値を本当にリセットしたい場合は、DoubleDisplayValueのセッターの次の行に沿って何かを行う必要があります。

Application.Current.Dispatcher.BeginInvoke(new Action(() =>
    {
        _doubleDisplayValue = originalValue;
        NotifyPropertyChanged("DoubleDisplayValue");
    }), DispatcherPriority.ContextIdle, null);
于 2012-04-04T15:42:37.083 に答える
2

フレームワークのバインディング検証システムを使用します(バインディング検証を実装する方法を参照)。

ユーザーが無効なものを入力した場合、ユーザーがそれを有効なものに編集できるように、無効な入力をコントロールに残しておく方がよい場合があります。これは、データを最初から再入力するように強制するよりもユーザーフレンドリーです。

たとえば、値が0.0で、ユーザーが「4.252w35326」と入力した場合、単に「w」を削除するのではなく、ユーザーに「4.25235326」ともう一度入力するように強制する必要がありますか?

于 2012-04-04T15:27:36.410 に答える