Calendar.DisplayDate TwoWay Binding распространяет обратно значение по умолчанию - PullRequest
2 голосов
/ 23 февраля 2011

У меня есть 2 календаря, которые я хочу показать в этом и следующем месяцах, но оба с одинаковой выбранной датой.Я использую 2 простых свойства ShownDate в своей модели для хранения и вычисления текущего и следующего месяца.

<Calendar SelectedDate="{Binding Date, Mode=TwoWay}" 
          DisplayDate="{Binding ShownDate, Mode=TwoWay}"
          Margin="4" AllowDrop="True" />
<Calendar SelectedDate="{Binding Date, Mode=TwoWay}" 
          DisplayDate="{Binding ShownDate2, Mode=TwoWay}"
          Margin="4" AllowDrop="True" />

Я понял, что перед тем, как показать его, я получаю распространение на свою модель в настройке свойства ShownDate2 в текущем месяце (UpdateSource), поэтому забыл мои значения по умолчанию (это должен быть следующий месяц, а не текущий).И это происходит перед любым запросом для моего значения (UpdateTarget происходит позже).

Это ошибка в поведении привязки Calendar.DisplayDate?

Обратите внимание, что все это содержится в DataTemplate, создаваемомContentPresenter, но я думаю, что это не имеет значения.

ОБНОВЛЕНИЕ: Теперь я уверен, что DataTemplates имеют значение, но не могут воспроизвести ошибку в простом проекте.Я все еще потерян.

1 Ответ

1 голос
/ 06 апреля 2011

Я считаю, что это может быть дубликат WPF: привязка свойства viewmodel типа DateTime к Calendar внутри ItemsControl , но для суммирования:

Проблема заключается в том, как Calendar инициализирует свойство DisplayDate. В настоящее время он делает это так:

public Calendar() {
    // ...
    base.SetCurrentValueInternal(DisplayDateProperty, DateTime.Today);
}

Похоже, что даже несмотря на то, что DisplayDate инициализируется до установления привязки, он все равно будет возвращаться к источнику привязки, как если бы он был установлен после. Скорее всего, это ошибка.

Вы можете обойти это, используя что-то вроде:

public class MyCalendar : Calendar {
    public MyCalendar() {
        this.ClearValue(DisplayDateProperty);
    }
}

Или вы можете установить привязку позднее (т.е. при загрузке Календаря).

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