Проверка свойства DateTime в viewmodel

У меня есть свойство DateTime (скажем, DateVal) в моем классе viewmodel и элемент DatePicker в представлении.

    

Проблема в том, что если пользователь удаляет дату, отображаемую в текстовом поле управления Datepicker, свойство DateVal не меняет его значение. Как я могу отслеживать, что пользователь удалил дату, отображаемую в текстовом поле datepicker? С уважением, Anirban

Элемент управления выбора даты выглядит следующим образом: Выбор даты перед редактированием текстового окна выбора даты Теперь, если пользователь просто удаляет дату, отображаемую в текстовом поле выбора даты, элемент управления выглядит следующим образом Выбор даты после редактирования даты выбора текстового поля В этот момент значение DateVal аналогично предыдущему. Только когда пользователь нажимает на значок календаря, Date присваивает значение null. Как я могу отслеживать изменение в то же время, когда пользователь делает текстовое поле пустым?

Код ViewModel

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

код xaml


Я хочу, чтобы свойство setter DateVal вызывалось, когда пользователь очищает текстовое поле Date Picker

1
nl ja de

1 ответы

Печальная новость заключается в том, что текстовое поле DatePicker установлено для обновления источника привязки только , когда он теряет фокус. Хорошей новостью является то, что вы можете подключиться к процессу с помощью DatePicker ControlTemplate :

XAML:


И код за:

DateTime? _dateVal = DateTime.Today;

public Nullable 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.

<Сильный> ИЗМЕНИТЬ

Обновлен обработчик события, чтобы обновить свойство pickers SelectedDate , а не свойство в модели представления. Таким образом, вы можете полностью удерживать хак в рамках представления, оставаясь агностиком viewmodel.

2
добавлено
Пробовал это, но он не работает
добавлено автор Anirban Paul, источник
Я отредактировал мой вопрос.
добавлено автор Anirban Paul, источник
Фактически я использую свойство DateTime с нулевым значением. Это не помогает.
добавлено автор Anirban Paul, источник
отредактировал код. Пожалуйста, посмотрите
добавлено автор Anirban Paul, источник
Я следую шаблону проектирования MVVM. Так что было бы неправильно устанавливать DateVal (свойство класса ViewModel) из кода, находящегося за точкой зрения.
добавлено автор Anirban Paul, источник
Спасибо. Я думаю, это сработает.
добавлено автор Anirban Paul, источник
Не могли бы вы разместить соответствующий код позади/код VM? Я запускаю тот же XAML, что и вы, с таким простым фрагментом кода, который я разместил в ответ, и обновления свойств DateVal, как ясно, как день.
добавлено автор Zoltan, источник
Прошу прощения за то, что ты висешь. Мне пришлось немного копаться, прежде чем выяснять (возможное) решение.
добавлено автор Zoltan, источник
Хорошо, одно небольшое изменение должно удовлетворять всем вашим потребностям MVVM.
добавлено автор Zoltan, источник
JavaScript Jobs — чат
JavaScript Jobs — чат
8 336 участник(ов)

JavaScript Jobs — чат для поиска работы и людей Правила оформления: https://teletype.in/@telegram-ru/r1WQe5F1m См. также: @mobile_jobs, @devops_jobs, @nodejs_jobs, @react_js, @angular_ru, @js_ru

JavaScript.ru
JavaScript.ru
7 932 участник(ов)

Сообщество сайта JavaScript.ru в Slack.

pro.js
pro.js
4 675 участник(ов)

Про JavaScript и NodeJS Invite: https://t.me/joinchat/Be4rsT5Rsgq30DHutjxXgA Правила: http://telegra.ph/ru-chat-rules-06-19 Вакансии только с ЗП, не чаще раза в неделю.

JavaScript — русскоговорящее сообщество
JavaScript — русскоговорящее сообщество
3 269 участник(ов)

Рекомендуем сразу отключить уведомления Правила: https://rudevs.network/ByaMH6un7 См. также: @js_noobs_ru, @nodejs_ru, @typescript_ru, @react_js, @electron_ru Вакансии и поиск работы: @javascript_jobs

JavaScript Noobs — сообщество новичков
JavaScript Noobs — сообщество новичков
2 484 участник(ов)

Чат для новичков

javascript_ru
javascript_ru
915 участник(ов)

Сообщество любителей самого популярного языка программирования в мире. Чат основан в 2009 году. Логи: https://goo.gl/9EOeM7 Поддержка бота: @chat_linker (ссылка на репу внутри) Вам будут интересны @frontend_ru и @css_ru

jsChat
jsChat
603 участник(ов)

Чат посвященный программированию на языке javaScript Перед отправкой ссылки на Ваш контент посоветуйтесь с админом Все ссылки удаляются ботом автоматически

JavaScript for Zombies Chat
JavaScript for Zombies Chat
492 участник(ов)

Чат про JavaScript для настоящих zombie! Вход строго по приглашениям! Ссылка для строгих приглашений: https://t.me/joinchat/AAMBHz3Uyr0tuZ7VaB029g

All That JS
All That JS
417 участник(ов)

JS на русском