Поскольку невозможно вставить значения в DataGridTemplateColumn.Я нашел несколько предложений по созданию моего собственного класса столбца, производного от DataGridBoundColumn.Пример ниже добавляет DatePicker в столбец без использования шаблона.
Однако этот пример не позволяет мне вручную устанавливать значение с помощью DatePicker, и я не уверен, почему.Я думаю, что есть что-то с привязкой.Он загрузит значения даты, которые я изначально привязал к нему, так что он на полпути.
Интересно, что с помощью некоторых других вспомогательных классов я также могу вставлять даты, что и было целью оригинала.Я просто не хотел ничего ломать.: -)
Есть идеи, как сделать так, чтобы выбранное значение указателя даты связывалось правильно?
class MyDateColumn : DataGridBoundColumn
{
public string DateFormat { get; set; }
protected override void CancelCellEdit(FrameworkElement editingElement, object uneditedValue)
{
DatePicker dp = editingElement as DatePicker;
if (dp != null)
{
dp.SelectedDate = DateTime.Parse(uneditedValue.ToString());
}
}
protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem)
{
DatePicker dp = new DatePicker();
Binding b = new Binding();
Binding bb = this.Binding as Binding;
b.Path = bb.Path;
b.Source = DatePicker.SelectedDateProperty;
if (DateFormat != null)
{
DateTimeConverter dtc = new DateTimeConverter();
b.Converter = dtc;
b.ConverterParameter = DateFormat;
}
dp.SetBinding(DatePicker.SelectedDateProperty, this.Binding);
return dp;
}
protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
{
TextBlock txt = new TextBlock();
Binding b = new Binding();
Binding bb = this.Binding as Binding;
b.Path = bb.Path;
b.Source = cell.DataContext;
if (DateFormat != null)
{
DateTimeConverter dtc = new DateTimeConverter();
b.Converter = dtc;
b.ConverterParameter = DateFormat;
}
txt.SetBinding(TextBlock.TextProperty, this.Binding);
return txt;
}
protected override object PrepareCellForEdit(FrameworkElement editingElement, RoutedEventArgs editingEventArgs)
{
DatePicker dp = editingElement as DatePicker;
if (dp != null)
{
DateTime? dt = dp.SelectedDate;
if (dt.HasValue)
return dt.Value;
}
return DateTime.Today;
}
protected override bool CommitCellEdit(FrameworkElement editingElement)
{
DatePicker dp = editingElement as DatePicker;
dp.SelectedDate = DateTime.Today.AddYears(1);
return true;
//return base.CommitCellEdit(editingElement);
}
}