時間値を入力するためのカスタム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は にバインドされ、ユーザーが時刻を変更したときにTimeのProxyTime日付コンポーネントが変更されないようにします。DependencyPropertyTimeDependencyPropertyには があり、必要に応じて の Textを更新するためにPropertyChangedCallbackを呼び出します。NotifyPropertyChangedProxyTimeTimeTextBox
ユーザーが無効な時間を入力した場合、これはうまく機能しません。Time の値が 01:30 で、ユーザーがそれを 25:30 に変更したとします。はTime DependencyProperty無効であるため 25:30 で更新されませんが、TimeTextBoxの Text プロパティには 25:30 があります。バッキング オブジェクトがリセットされると、Time は再び 01:30 に設定されますが、DependencyProperty の観点からは値が変更されていないため、PropertyChangedCallback は呼び出されません。したがって、NotifyPropertyChanged は ProxyTime に対して呼び出されず、TimeTextBox のテキストには引き続き 25:30 が含まれます。
この UserControl を作成して、バインドされたDateTime日付が変更されないようにする方法がわかりませんがText、以前の値が無効だったときに の値が適切に更新されます。