DateTime属性在更改时未触发PropertyChanged事件

时间:2010-04-15 03:46:34

标签: wpf data-binding datetime mvvm properties

我正在开发一个WPF MVVM应用程序,我的视图上有一个TextBox,它绑定到ViewModel上的DateTime属性。看起来很简单,但是当我清除TextBox中的文本时,属性永远不会改变。事实上,在我开始输入“4/1 ......”之后它甚至都不会发射,然后它会发射。我该怎么做才能解决这个问题?显然,我可以将TextBox绑定到字符串属性,然后更新setter中的real属性,但这有点像黑客。必须有一个更好的方式...

视图模型

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

视图

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

1 个答案:

答案 0 :(得分:3)

这取决于当文本框内容不是有效的DateTime时您想要发生什么。空字符串无法解析为DateTime,因此当您清除文本框时,WPF不知道要将哪个值推回到绑定源,因此它不会执行任何操作,并且您的setter无法获取跑。一旦你键入足够的可解析性,WPF就会获得程序并再次开始更新,因此你的PropertyChanged事件会再次开始触发。因此,您需要做的第一件事是在文本为空或不可解析时决定您想要的DateTime值。

完成后,您可以创建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;
  }
}

并将其插入到绑定中:

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

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