【问题标题】:WPF: How to use DatePicker in XAML-DataGridWPF:如何在 XAML-DataGrid 中使用 DatePicker
【发布时间】:2010-09-06 08:57:48
【问题描述】:

在一个独立的 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 而不是文本条目来输入一些日期,但没有或类似的东西。

那么如何在 DataGrid 中获取 DatePicker(或其他任何内容)作为输入字段?

【问题讨论】:

    标签: wpf xaml datagrid datepicker


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-06-20
        • 1970-01-01
        • 1970-01-01
        • 2020-11-28
        • 1970-01-01
        • 2018-05-05
        • 1970-01-01
        • 2017-06-08
        • 1970-01-01
        相关资源
        最近更新 更多