2010-09-06 4 views
3

Dans une application WPF standanlone, j'ai obtenu un DataGrid pour entrer certaines valeurs. Pour les valeurs de texte cela fonctionne bien comme ça:WPF: comment utiliser DatePicker dans XAML-DataGrid

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding MyCollection}"> 
    <DataGrid.Columns> 
    <DataGridTextColumn Header="Name" Binding="{Binding Name}"/> 
    <DataGridTextColumn Header="Description" Binding="{Binding Description}"/> 
    </DataGrid.Columns> 
</DataGrid> 

Mais maintenant, je voudrais entrer des dates en utilisant un DatePicker au lieu d'une entrée de texte, mais il n'y a pas ou quelque chose de similaire.

Alors, comment puis-je obtenir un champ DatePicker (ou autre chose) en tant que champ d'entrée dans le DataGrid?

Répondre

6

Utilisez le DataGridTemplateColumn. Là, vous pouvez spécifier les modèles pour l'édition et l'état normal. Regardez l'exemple dans l'article. Il vous montrera comment utiliser.

0

Je préfère utiliser un code derrière l'approche

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)); 
    } 
} 
Questions connexes