我正在开发一个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}"/>
答案 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}"/>