2

我正在创建一个自定义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);
        }
    }

TimeTextBoxText绑定到ProxyTime, 以防止DependencyProperty用户更改时间时时间的日期组件发生更改。The TimeDependencyProperty有一个PropertyChangedCallback,它要求NotifyPropertyChanged,在必要时ProxyTime更新TimeTextBox's Text。

当用户输入无效时间时,这不起作用。假设时间值为 01:30,而用户将其更改为 25:30。Time DependencyProperty不会在 25:30 更新,因为它是无效的,但是的TimeTextBoxText 属性有 25:30。现在,如果支持对象被重置,时间将再次设置为 01:30,但不会调用 PropertyChangedCallback,因为从 DependencyProperty 的角度来看,该值没有改变。因此,不会为 ProxyTime 调用 NotifyPropertyChanged,并且 TimeTextBox 的文本仍将包含 25:30。

我不确定如何创建此 UserControl 以使绑定DateTime的日期不会更改,而Text当先前的值无效时会正确更新 的值。

4

0 回答 0