2

時間値を入力するためのカスタムTextBox( ) を作成しています。TimeTextBoxアイデアは、ユーザーが数字を入力するだけで、レジのように右から左に時間の数字が入力されるというものです。

TimeInput 設計

を持つ新しい UserControl を作成しましTimeInputTime 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、以前の値が無効だったときに の値が適切に更新されます。

4

0 に答える 0