DatePicker DisplayDate Binding Issue - PullRequest
       23

DatePicker DisplayDate Binding Issue

1 голос
/ 06 декабря 2011

Кажется, что DisplayDate не связывается правильно, когда DatePicker находится внутри шаблона ControlTemplate.

Вот как я связываю DisplayDate с DatePicker через MVVM.Но DatePicker не будет правильно отображать CustomDisplayDate.По умолчанию отображается дата отображения по умолчанию DateTime.Now ().

Имейте в виду, что этот код работает, если DatePicker не находится внутри шаблона ControlTemplate.

Любые предложения о том, как решитьэто?

XAML-код:

<Window.Resources>
    <ControlTemplate x:Key="DateField">
        <StackPanel>
            <TextBlock Text="Custom Display Date:" />
            <TextBlock Text="{Binding CustomDisplayDate}"/>
            <DatePicker 
                SelectedDate="{Binding CustomSelectedDate}" 
                DisplayDate="{Binding CustomDisplayDate}" 
                HorizontalAlignment="Left" 
                VerticalAlignment="Top"/>
        </StackPanel>
    </ControlTemplate>
</Window.Resources>
<Grid>
    <ContentControl Template="{StaticResource DateField}" />
</Grid>

и ViewModel:

public class MainWindowViewModel
{
  public MainWindowViewModel()
  {
     CustomDisplayDate = DateTime.Now.AddDays(5);
  }

  public DateTime? CustomSelectedDate { get; set; }
  public DateTime CustomDisplayDate { get; set; }
}

Ответы [ 2 ]

1 голос
/ 29 марта 2013

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

Я нашел обходной путь, по крайней мере, в моем случае. Я связал событие PreparingCellForEdit со своей моделью ViewModel. Этот метод просматривает столбец, чтобы определить, принадлежит ли ячейка редактирования к правильному столбцу указателей даты, и я также проверил, является ли дата, к которой она привязана, нулевой, что говорит мне, что это была новая строка. Затем я могу взять указатель даты и установить его DisplayDate из кода.

private void OnPreparingCellForEdit(DataGridPreparingCellForEditEventArgs e)
{
    DataGridColumn sourceColumn = e.Column;
    DataGridRow sourceRow = e.Row;
    ScheduleDate data = (ScheduleDate) sourceRow.DataContext;

    if (string.Equals(sourceColumn.Header.ToString(), "Work Date") && !data.WorkDate.HasValue)
    {
        var dp = e.EditingElement.GetVisualChild<DatePicker>() as DatePicker;
        dp.DisplayDate = this.WorkDate;
    }
}
1 голос
/ 06 декабря 2011

Первая проблема заключается в том, что вы не используете INotifyPropertyChanged.

Пожалуйста, просмотрите статьи, ссылки на которые приведены ниже:

...