当绑定属性强制执行某些业务规则时,绑定的WPF TextBox不会更新值

时间:2014-03-10 17:49:14

标签: c# wpf .net-4.0 inotifypropertychanged

我正在使用.NET 4.0。我有一些非常简单的代码,允许用户输入1到99,999(含)之间的数字。我在属性设置器中有一些逻辑,如果它不符合业务规则(例如,它不是数字或数字太大),则会阻止应用最新值。

    public class MainViewModel : INotifyPropertyChanged
{
    #region Fields

    private string _text = string.Empty;

    #endregion // Fields

    #region Properties

    public string Text
    {
        get { return _text; }

        set
        {
            if (_text == value) return;

            if (IsValidRange(value))
            {
                _text = value;
            }

            OnPropertyChanged("Text");
        }
    }

    #endregion // Properties

    #region Private Methods

    private bool IsValidRange(string value)
    {
        // An empty string is considered valid.
        if (string.IsNullOrWhiteSpace(value)) return true;

        // We try to convert to an unsigned integer, since negative bill numbers are not allowed,
        // nor are decimal places.
        uint num;
        if (!uint.TryParse(value, out num)) return false;

        // The value was successfully parse, so we know it is a non-negative integer.  Now, we
        // just need to make sure it is in the range of 1 - 99999, inclusive.
        return num >= 1 && num <= 99999;
    }

    #endregion // Private Methods

    #region INotifyPropertyChanged Implementation

    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }

    #endregion // INotifyPropertyChanged Implementation
}

我遇到的问题是,当值无效且我只是忽略该值时,绑定到此属性的TextBox不会更新以反映该更改;相反,它只是保留输入的值。这是我如何绑定属性:

        <TextBox Grid.Row="0"
             Text="{Binding Path=Text, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>

谁能告诉我我做错了什么?

我已经阅读了许多与此类似的问题,但没有一个答案对我有用。奇怪的是,当我不根据数字进行验证,只是将所有输入的文本更改为大写时,它就可以正常工作。当我尝试不将Property设置为新值时,它似乎无效。

1 个答案:

答案 0 :(得分:7)

这似乎是.NET 3.5-4.0中TextBox的错误。我首先在4.5中尝试过这个,你的代码按照书面编写,但当我将项目转换为4.0时,我可以重现这个问题。做了一些搜索后,我发现:

WPF Textbox refuses to update itself while binded to a view model property,详细说明了引用的解决方法:

Textbox getting out of sync with viewmodel property

当然,如果您可以使用.NET 4.5我会建议,但当然并不总是那么容易。