Календарная привязка SelectedDate и DisplayDate: серые даты - PullRequest
2 голосов
/ 07 января 2012

Исходный вариант использования:

Это возможный вариант использования, который я пытаюсь решить:

  1. Пользователь открывает страницу с моим календаремустановить текущую дату
  2. Пользователь выбирает дату несколько месяцев назад
  3. Пользователь обновляет страницу, в результате чего выбранная дата в виртуальной машине сбрасывается на текущую дату

Ожидается: В календаре отображается текущая дата

Факт: (с привязкой только для SelectedDate) Календарь перемещает только выбранную дату, но продолжает отображатьранее выбранный месяц

Мое решение:

В сценарии MVVM я показываю элемент управления Calendar, у которого SelectedDate имеет привязку к свойству SelectedDate в моем ViewModel,Свойство в моей виртуальной машине запускает событие PropertyChanged, когда оно установлено.

Выбранную дату в моей виртуальной машине можно также установить из других частей моего кода, поэтому я хочу, чтобы в моем календаре всегда отображалась выбранная дата (дляНапример, когда другой месяц установлен в качестве выбранной даты, я хочу, чтобы мой календарь переключился на этот месяц).Чтобы получить такое поведение, я также связал свойство DisplayDate моего календаря со своим свойством SelectedDate, и это дает мне ожидаемое поведение, за исключением случаев, когда я нажимаю на серые даты предыдущего или следующего месяца.

Этомой календарь в XAML:

<Calendar SelectedDate="{Binding Path=SelectedDate}" DisplayDate="{Binding Path=SelectedDate}" />

Это свойство SelectedDate в моей ViewModel (реализует INotifyPropertyChanged)

    public DateTime SelectedDate
    {
        get 
        { 
            return selectedDate; 
        }
        set 
        { 
            selectedDate = value;
            this.PropertyChanged(this, new PropertyChangedEventArgs("SelectedDate"));
        }
    }

Проблема с решением:

Видимо, нажатие на серую дату приводит к тому, что SelectedDate устанавливается при наведении мыши, а затем при наведении мыши вверх, что приводит к выбору даты через два месяца.

Есть лилучший способ реализовать такое поведение?Или я могу исправить проблему DisplayDate (без слишком большого взлома, то есть не иметь / как можно меньше кода в коде позади)?

Все, что мне действительно нужно, это свойство SelecteDate, которое также имеет поведение DisplayDate property:)

Спасибо за помощь!

Ответы [ 2 ]

4 голосов
/ 20 июня 2016

У меня только что возникла эта проблема, и я наткнулся на этот ответ, который, хотя он работал, я разобрал дальше и обнаружил, что решение чрезвычайно простое. Просто свяжите с DisplayDate как Mode=OneTime. Больше ничего не нужно.

DisplayDate="{Binding SelectedDate, Mode=OneTime, UpdateSourceTrigger=PropertyChanged}"
SelectedDate="{Binding SelectedDate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
3 голосов
/ 03 февраля 2012

То, как я решил исправить это сейчас, находится в моем коде позади загруженного события календаря:

private void CalendarLoaded(object sender, RoutedEventArgs e)
{
    if (this.ViewStartCalendar.SelectedDate.HasValue)
    {
        this.ViewStartCalendar.DisplayDate = this.ViewStartCalendar.SelectedDate.Value;
    }
}

Я бы лучше сделал это в XAML или в моей модели представления, но яможно жить с этим решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...