2013-09-08 5 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를 추가하려면 어떻게합니까? Nitesh 말했듯이WPG의 DataGridTextColumn에 DatePicker를 추가하는 방법

+0

'DataGridTemplateColumn'을 사용하십시오. – Nitesh

답변

21

,

<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

DataGridTemplateColumn 내가 여기, 내 DataGrids를 모든 컬럼에 DatePicker에서 넣어 내가 창문 생성자의 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] 키가 더 이상 작동하지 않습니다 (변경 사항을 적용하지 않습니다). 물론 다른 필드 나 행을 집중시킬 수 있지만,이 모양은 다소 이상합니다. 사용자. [탭]/[BackTab] 그래도 작동합니다. –

관련 문제