2013-09-08 36 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> 

Tôi có một sơ đồ đơn giản với một DataGridTextColumn trong đó. Làm thế nào để thêm một Datepicker vào DataGridTextColumn của tôi?Cách thêm DatePicker vào DataGridTextColumn trong WPF

+0

Sử dụng 'DataGridTemplateColumn'. – Nitesh

Trả lời

21

Như Nitesh nói, sử dụng 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

bộ chọn ngày giờ không hiển thị trong datagrid – SANDEEP

4

tôi đặt một DatePicker trong mỗi cột của datagrids của tôi, đây là phương pháp helper của tôi mà tôi gán cho DataGrid trong cửa sổ constructor. Phương pháp này cũng hủy thế hệ cho đối tượng phức tạp mà sẽ không hiển thị tuyệt vời trong DataGrid.

Thích ứng với ý muốn của bạn!

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

Điều này xây dựng trên @ câu trả lời của Guish nhưng đóng gói nó vào một lớp cột mới.

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

Câu trả lời sáng chói và điều làm cho nó thực sự tuyệt vời là ở dạng có thể tái sử dụng cao! Nó sẽ có giá trị hơn nếu chúng ta có thể xác định xem có hiển thị phần "Date" - chỉ trong TextBlock (đã thử nó với một trường Date table và đã có thời gian) hay chưa, hoặc có thể thiết lập StringFormat của Binding . –

+0

Tôi cũng nhận thấy một thứ khác, nếu bạn đi và chỉnh sửa ngày, phím [Enter] không còn hoạt động nữa (nó sẽ không cam kết thay đổi), bạn có thể tập trung vào một trường hoặc hàng khác, nhưng trông hơi lạ người dùng. [Tab]/[BackTab] vẫn hoạt động. –

Các vấn đề liên quan