ではWPF
、TextBox
ユーザー入力を検証して、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;
}
}
}
私の目標を達成するための最良の方法は何ですか?