時間値を入力するためのカスタム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
は にバインドされ、ユーザーが時刻を変更したときにTimeのProxyTime
日付コンポーネントが変更されないようにします。DependencyProperty
TimeDependencyProperty
には があり、必要に応じて の Textを更新するためにPropertyChangedCallback
を呼び出します。NotifyPropertyChanged
ProxyTime
TimeTextBox
ユーザーが無効な時間を入力した場合、これはうまく機能しません。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
、以前の値が無効だったときに の値が適切に更新されます。