views:

89

answers:

1

I'm working on a WPF MVVM application and I've got a TextBox on my view that is bound to a DateTime property on the ViewModel. Seems simple enough, but when I clear the text in the TextBox, the property never changes. In fact, it never even fires until I begin typing "4/1..." and then it fires. What can I do to fix this? Obviously I could bind the TextBox to a string property and then update the real property in the setter, but that's a bit of a hack. There's got to be a better way...

ViewModel

private DateTime _startDate;
public DateTime StartDate
{
    get { return _startDate; }
    set
    {
        _startDate = value;
        OnPropertyChanged("StartDate");
    }
}

View

<TextBox Text="{Binding Path=StartDate, 
               UpdateSourceTrigger=PropertyChanged, 
               ValidatesOnDataErrors=true}"/>
+1  A: 

It depends on what you want to happen when the text box content isn't a valid DateTime. The empty string can't be parsed as a DateTime, so when you clear your text box, WPF doesn't know what value to push back to your binding source, so it doesn't do anything, and your setter doesn't get run. Once you type enough to be parseable, WPF gets with the program and starts updating again, so your PropertyChanged event starts firing again. So the first thing you need to do is decide what DateTime value you want when the text is empty or unparseable.

Once you've done that, you can create an IValueConverter:

// Simplified, ignoring error checking, etc.
public class DateTimeConverter : IValueConverter
{
  // For source -> target (DateTime -> string) conversion
  public object Convert(object value...)
  {
    return value.ToString();  // ignoring culture, date-time format, etc.
  }

  // For target -> source (string -> DateTime) conversion
  public object ConvertBack(object value...)
  {
    string str = (string)value;
    DateTime dt = GetDateTimeFromMaybePartialString(str);  // your logic here
    return dt;
  }
}

and insert that into the binding:

<Window.Resources>
  <local:DateTimeConverter x:Key="dtc" />
</Window.Resources>

<TextBox Text="{Binding Path=StartDate, 
                        Converter={StaticResource dtc},
                        UpdateSourceTrigger=PropertyChanged, 
                        ValidatesOnDataErrors=true}"/>
itowlson