2013-09-08 51 views
8
<DataGrid Name="myfirstdg" Grid.Row="2" AutoGenerateColumns="False" CanUserSortColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" SelectionUnit="Cell" > 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Date" Binding="{Binding Path=date}" Width="SizeToCells" IsReadOnly="True" MinWidth="100"></DataGridTextColumn> 
     </DataGrid.Columns> 
    </DataGrid> 

DataGridTextColumnを持つ単純なdategridがあります。 DataGridTextColumnにDatepickerを追加するにはどうすればよいですか?WPFのDataGridTextColumnにDatePickerを追加する方法

+0

「DataGridTemplateColumn」を使用してください。 – Nitesh

答えて

21

Niteshが言ったように、私は私のデータグリッドのすべての列に日付ピッカーを入れDataGridTemplateColumn

<DataGridTemplateColumn Header="Pick a Date"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding myDate}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
    <DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <DatePicker SelectedDate="{Binding myDate}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellEditingTemplate> 
</DataGridTemplateColumn> 
+0

datagridのdatetime pickerが表示されない – SANDEEP

4

を使用し、ここで私は窓のコンストラクタでDataGridに割り当てる私のヘルパーメソッドです。このメソッドは、DataGridで大きく表示されない複雑なオブジェクトの生成もキャンセルします。

希望に応じて変更してください!

public MainWindow() 
    { 
     InitializeComponent(); 
     myDataGrid.AutoGeneratingColumn += DataGridUtilities.dataGrid_AutoGeneratingColumn; 
    } 

public static class DataGridUtilities 
{ 
    public static void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
    { 
     if (!IsTypeOrNullableOfType(e.PropertyType, typeof (String)) && 
      !IsNullableOfValueType(e.PropertyType)) 
      e.Cancel = true; 
     else if (IsTypeOrNullableOfType(e.PropertyType, typeof (DateTime))) 
     { 
      DataGridTemplateColumn col = new DataGridTemplateColumn(); 
      col.Header = e.Column.Header; 
      FrameworkElementFactory datePickerFactoryElem = new FrameworkElementFactory(typeof (DatePicker)); 
      Binding dateBind= new Binding(e.PropertyName); 
      dateBind.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; 
      dateBind.Mode = BindingMode.TwoWay; 
      datePickerFactoryElem.SetValue(DatePicker.SelectedDateProperty, dateBind); 
      datePickerFactoryElem.SetValue(DatePicker.DisplayDateProperty, dateBind); 
      DataTemplate cellTemplate = new DataTemplate(); 
      cellTemplate.VisualTree = datePickerFactoryElem; 
      col.CellTemplate = cellTemplate; 
      e.Column = col;//Set the new generated column 
     } 
    } 


    private static bool IsTypeOrNullableOfType(Type propertyType, Type desiredType) 
    { 
     return (propertyType == desiredType || Nullable.GetUnderlyingType(propertyType) == desiredType); 
    } 

    private static bool IsNullableOfValueType(Type propertyType) 
    { 
     return (propertyType.IsValueType || 
       (Nullable.GetUnderlyingType(propertyType) != null && 
       Nullable.GetUnderlyingType(propertyType).IsValueType)); 
    } 
} 
1

これは、@ Guishの答えを基にしていますが、新しい列クラスにカプセル化しています。

private void Grid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
{ 
    if (e.PropertyType == typeof(DateTime)) 
    { 
     e.Column = new DataGridDateTimeColumn((DataGridBoundColumn)e.Column); 
    } 
} 

internal class DataGridDateTimeColumn : DataGridBoundColumn 
{ 
    public DataGridDateTimeColumn(DataGridBoundColumn column) 
    { 
     Header = column.Header; 
     Binding = (Binding)column.Binding; 
    } 

    protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem) 
    { 
     var control = new TextBlock(); 
     BindingOperations.SetBinding(control, TextBlock.TextProperty, Binding); 
     return control; 
    } 

    protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem) 
    { 
     var control = new DatePicker(); 
     BindingOperations.SetBinding(control, DatePicker.SelectedDateProperty, Binding); 
     BindingOperations.SetBinding(control, DatePicker.DisplayDateProperty, Binding); 
     return control; 
    } 
} 
+0

鮮やかな答えです。本当に素晴らしいのは、再利用可能な形式になっていることです。 TextBlockに "Date"専用部分を表示するか(Date表のフィールドで試してみて、時間があるか)、BindingのStringFormatを設定する方が良いかどうかを指定することができれば、さらに価値があります。 –

+0

あなたが行って日付を編集すると、[Enter]キーが機能しなくなりました(変更をコミットしません)。もちろん、別のフィールドや行にフォーカスすることはできますが、この外観はやや奇妙ですユーザー。 [Tab]/[BackTab]でも動作します。 –

関連する問題