5

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;
        }
    }   
}

实现我的目标的最佳方式是什么?

4

2 回答 2

4

如果您真的想重置 TextBox 中显示的值,您必须在 DoubleDisplayValue 的 setter else 中执行以下操作:

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

我会使用框架的绑定验证系统(请参阅如何实现绑定验证)。

当用户键入无效的内容时,最好将无效输入留在控件中,以便用户可以将其编辑为有效的内容。这比强迫他们从头开始重新输入数据更加用户友好。

例如,如果值为 0.0,并且用户键入“4.252w35326”,我们是否应该强制用户再次键入“4.25235326”,而不是简单地删除“w”?

于 2012-04-04T15:27:36.410 回答