在WPF
中,我想制作一个TextBox
验证用户输入以仅允许解析为双精度的输入。当框失去焦点(和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;
}
}
}
实现我的目标的最佳方式是什么?