title: Bound WPF TextBox is not updating value when the bound property enforces some business rules
body: <p>I am using .NET 4.0.  I have some very simple code that lets the user type in a number between 1 and 99,999 (inclusive).  I have some logic in the Property setter that prevents the latest value from being applied if it does not adhere to the business rules (e.g., it is not a number or the number is too large).</p>
  
  <pre><code>    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 &gt;= 1 &amp;&amp; num &lt;= 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
  }
  </code></pre>
  
  <p>The problem I am running into is that when the value is not valid and I just ignore the value, the TextBox bound to this property does not update to reflect that change; rather, it just retains the value as it is typed in.  Here is how I have the property bound:</p>
  
  <pre><code>        &lt;TextBox Grid.Row="0"
               Text="{Binding Path=Text, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/&gt;
  </code></pre>
  
  <p>Can anyone tell me what I'm doing wrong?</p>
  
  <p>I have read a lot of questions that seemed very similar to this, but none of the answers worked for me.  The weird thing is that when I don't validate based on numbers, but just change all text typed in to be upper case, it works just fine.  It just seems to not work when I try to not set the Property to the new value.</p>