我正在创建一个自定义TextBox
( TimeTextBox
) 用于输入时间值。这个想法是用户只需输入数字,时间数字将从右到左填写,就像收银机一样。
我创建了一个新的 UserControl TimeInput
,它有一个Time
DependencyProperty
:
public DateTime Time
{
get { return (DateTime)GetValue(TimeProperty); }
set { SetValue(TimeProperty, value); }
}
public static readonly DependencyProperty TimeProperty =
DependencyProperty.Register("Time",
typeof(DateTime),
typeof(TimeInput),
new FrameworkPropertyMetadata(DateTime.Today, (s, e) => (s as TimeInput).NotifyPropertyChanged("ProxyTime")) { BindsTwoWayByDefault = true });
TimeInput
也有一个公共财产,ProxyTime
:
public DateTime ProxyTime
{
get { return Time; }
set
{
if (Time.Hour != value.Hour || Time.Minute != value.Minute)
Time = new DateTime(Time.Year, Time.Month, Time.Day, value.Hour, value.Minute, 0, 0);
}
}
TimeTextBox
的Text
绑定到ProxyTime
, 以防止DependencyProperty
用户更改时间时时间的日期组件发生更改。The TimeDependencyProperty
有一个PropertyChangedCallback
,它要求NotifyPropertyChanged
,在必要时ProxyTime
更新TimeTextBox
's Text。
当用户输入无效时间时,这不起作用。假设时间值为 01:30,而用户将其更改为 25:30。Time
DependencyProperty
不会在 25:30 更新,因为它是无效的,但是的TimeTextBox
Text 属性有 25:30。现在,如果支持对象被重置,时间将再次设置为 01:30,但不会调用 PropertyChangedCallback,因为从 DependencyProperty 的角度来看,该值没有改变。因此,不会为 ProxyTime 调用 NotifyPropertyChanged,并且 TimeTextBox 的文本仍将包含 25:30。
我不确定如何创建此 UserControl 以使绑定DateTime
的日期不会更改,而Text
当先前的值无效时会正确更新 的值。