1

ビューモデル クラスに DateTime プロパティ (たとえば、DateVal) があり、View に DatePicker コントロールがあります。

    <DatePicker         Grid.Column="1"
                        Width="100"
                        Height="30"
                        SelectedDate="{Binding DateVal,ValidatesOnDataErrors=True}"/>

問題は、ユーザーが Datepicker コントロールのテキスト ボックスに表示されている日付を削除した場合、DateVal プロパティの値が変更されないことです。ユーザーが日付ピッカーテキストボックスに表示された日付を削除したことを追跡するにはどうすればよいですか? よろしく、 アニルバン

日付ピッカー コントロールは次のようになります 日付ピッカー テキスト ボックスを編集する前の日付ピッカー 。ユーザーが日付ピッカー テキスト ボックスに表示されている日付を削除すると、コントロールは次のようになります 日付ピッカー テキスト ボックスを編集した後の日付ピッカー 。その時点で、DateVal の値は以前と同じです。ユーザーがカレンダー アイコン Date をクリックした場合にのみ、値 null が割り当てられます。ユーザーがテキストボックスを空にすると同時に変更を追跡するにはどうすればよいですか?

ViewModel コード

public DateTime? DateVal
    {
        get
        {
            return this.dateVal;
        }
        set
        {
            this.dateVal = value;
            this.OnPropertyChanged("DateVal");
        }
    }

xaml コード

<DatePicker Name="datePickerDateVal"
                        Grid.Column="1"
                        Width="100"
                        Height="30"
                        SelectedDate="{Binding DateVal,ValidatesOnDataErrors=True}"
                        Text="{Binding DateVal,ValidatesOnDataErrors=True,UpdateSourceTrigger=PropertyChanged}"                          />

ユーザーが日付ピッカー テキスト ボックスをクリアしたときに、DateVal のセッター プロパティを呼び出す必要があります。

4

1 に答える 1

2

残念なことに、DatePicker のテキスト ボックスは、フォーカスを失った場合にのみバインド ソースを更新するように設定されています。良いニュースは、 を介してプロセスにフックできることDatePickerですControlTemplate

XAML:

<DatePicker SelectedDate="{Binding DateVal}" x:Name="__picker" />

コードビハインド:

DateTime? _dateVal = DateTime.Today;

public Nullable<DateTime> DateVal
{
    get { return _dateVal; }
    set
    {
        if (_dateVal == value)
            return;

        _dateVal = value;
        OnPropertyChanged("DateVal");
    }
}

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    DatePickerTextBox pickerTextBox = __picker.Template.FindName("PART_TextBox", __picker) as DatePickerTextBox;
    if (pickerTextBox == null)
        return;

    pickerTextBox.TextChanged += new TextChangedEventHandler(pickerTextBox_TextChanged);
}

void pickerTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
    DatePickerTextBox tb = sender as DatePickerTextBox;

    if (tb == null)
        return;

    if (string.IsNullOrEmpty(tb.Text))
    {
        __picker.SelectedDate = null;
    }
}

私はそれをいじりましたが、より頻繁に更新されない理由は、テキストと選択された日付プロパティの間の循環関係であると推測しています。ただし、null DateTimes の更新を確実に取得することは問題ありません。

編集

SelectedDateビュー モデルのプロパティではなく、ピッカー プロパティを更新するようにイベント ハンドラーを更新しました。このようにして、ビューモデルにとらわれずに、ハックをビュー内に完全に保持できます。

于 2013-02-07T14:07:52.513 に答える