WPF:如何在XAML-DataGrid中使用DatePicker

时间:2010-09-06 08:57:48

标签: wpf xaml datagrid datepicker

在standanlone WPF应用程序中,我得到一个DataGrid来输入一些值。对于文本值,这很好用,就像这样:

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

但现在我想使用DatePicker而不是文本条目输入一些日期,但没有或类似的东西。

那么如何将DatePicker(或其他任何东西)作为DataGrid中的输入字段?

2 个答案:

答案 0 :(得分:6)

使用DataGridTemplateColumn。您可以在其中指定用于编辑和正常状态的模板。请看文章中的示例。它会告诉你如何使用。

答案 1 :(得分:0)

我更喜欢使用代码隐藏方法

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