我正在尝试在代码中设置 DatePicker DataGrid 列。此列与不同的 DataGrids 一起使用,每个 DataGrids 显示不同类型的对象。从这篇文章中,我想出了以下代码,它可以正常工作:
public DataGridColumn GetDataGridColumn(string header, bool isReadOnly, string fieldName)
{
DataGridTemplateColumn dgCol = new DataGridTemplateColumn();
dgCol.Header = header;
dgCol.IsReadOnly = isReadOnly;
FrameworkElementFactory dateFactory = new FrameworkElementFactory(typeof(DatePicker));
dateFactory.SetBinding(DatePicker.SelectedDateProperty, new Binding(fieldName));
dateFactory.SetValue(DatePicker.IsEnabledProperty, !isReadOnly);
DataTemplate cellTemplate = new DataTemplate();
cellTemplate.VisualTree = dateFactory;
dgCol.CellTemplate = cellTemplate;
return dgCol;
}
但是,由于以编程方式创建模板的方法已FrameworkElementFactory
被弃用,因此我认为我最好寻找另一种方法。
作为替代方案,我考虑创建一组 DataTemplates 作为资源,然后在代码中应用它们。到目前为止,这是我必须要做的,但我不确定如何设置绑定。这是我的 DatePicker 模板:
<DataTemplate x:Key="DatePickerColumnCellTemplate">
<DatePicker SelectedDate="{Binding Path=StartDate}" />
</DataTemplate>
这是新GetDataGridColumn
方法:
public DataGridColumn GetDataGridColumn(string header, bool isReadOnly, string fieldName)
{
DataGridTemplateColumn dgCol = new DataGridTemplateColumn();
dgCol.Header = header;
dgCol.IsReadOnly = isReadOnly;
dgCol.CellTemplate = (DataTemplate)Application.Current.FindResource("DatePickerColumnCellTemplate");
return dgCol;
}
这种新方法似乎是一种更优雅的解决方案,因为现在 DatePicker 列的 UI 设计是在 XAML 中定义的,并且只能使用代码应用。但是,现在我的 DatePicker 列只显示开始日期。该fieldName
方法中的参数可以是“StartDate”或“EndDate”或在数据网格中显示的对象中定义的任何其他 DateTime 变量。另外我不确定如何将 DatePickerIsEnabled
属性设置为 isReadOnly 的值。
如果您认为这不是最好的方法,请告诉我。
谢谢。