コードで DatePicker DataGrid 列を設定しようとしています。この列は異なる DataGrid で使用され、それぞれが異なるタイプのオブジェクトを表示します。この投稿から、問題なく動作する次のコードを思いつきました。
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 の値に設定する方法もわかりません。
これが最善の方法ではないと思われる場合は、お知らせください。
ありがとう。