C# 如何以编程方式将DataGrid列设置为DatePicker输入

C# 如何以编程方式将DataGrid列设置为DatePicker输入,c#,wpf,datagrid,datatable,datepicker,C#,Wpf,Datagrid,Datatable,Datepicker,有一些文章解释了如何在DataGrid或中创建特定列,但它们都是通过XAML实现的。这样做: <DataGrid AutoGenerateColumns="True"> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding Name}" /> <DataGridTemplateColumn>

有一些文章解释了如何在DataGrid或中创建特定列,但它们都是通过XAML实现的。这样做:

<DataGrid AutoGenerateColumns="True">
        <DataGrid.Columns>

                <DataGridTextColumn Binding="{Binding Name}" />

                <DataGridTemplateColumn>
                        <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                        <DatePicker SelectedDate="{Binding Date}" />
                                </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

        </DataGrid.Columns>
</DataGrid>
<DataGrid RowEditEnding="updateDatabase" ItemsSource="{Binding}" AutoGenerateColumns="True">

    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Setter Property="Visibility" Value="{Binding Visibility}" />
        </Style>
    </DataGrid.RowStyle>

</DataGrid>
        dataTable.Rows[0][15] = new DateTime(1991, 9, 2);
对于我的XAML,如下所示:

<DataGrid AutoGenerateColumns="True">
        <DataGrid.Columns>

                <DataGridTextColumn Binding="{Binding Name}" />

                <DataGridTemplateColumn>
                        <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                        <DatePicker SelectedDate="{Binding Date}" />
                                </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

        </DataGrid.Columns>
</DataGrid>
<DataGrid RowEditEnding="updateDatabase" ItemsSource="{Binding}" AutoGenerateColumns="True">

    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Setter Property="Visibility" Value="{Binding Visibility}" />
        </Style>
    </DataGrid.RowStyle>

</DataGrid>
        dataTable.Rows[0][15] = new DateTime(1991, 9, 2);

但是这些只是作为单元格中的日期字符串结束,而不是日期选择器输入类型?有没有办法做到这一点?比如说

        dataTable.Columns[13].DataType.Equals(typeof(DatePicker));
        dataTable.Columns[13].DataType.Equals(typeof(DatePickerTextBox));
提前谢谢

编辑:

如果我可以通过XAML部分实现,也没关系。例如,如果我制作我的XMAL:

<DataGrid RowEditEnding="updateDatabase" Name="taskTable" ItemsSource="{Binding}" AutoGenerateColumns="True" HorizontalAlignment="Left" Margin="25,50,25,25" VerticalAlignment="Top" Grid.IsSharedSizeScope="True" SelectionChanged="DataGrid_SelectionChanged_1">

    <!-- VirtualizingStackPanel.IsVirtualizing="False" -->
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Setter Property="Visibility" Value="{Binding Visibility}" />
        </Style>

    </DataGrid.RowStyle>

    <DataGrid.Columns>

        <DataGridTemplateColumn Header="dates">
            <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                    <DatePicker SelectedDate="{Binding dates}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellEditingTemplate>
        </DataGridTemplateColumn>

    </DataGrid.Columns>                    

</DataGrid>
我加载的DataTable中的dates列类似于taskTable.DataContext=DataTable.DefaultView;我是否可以让dates列与C中DataTable中的数据在dates下与XAML中的模板保持一致

在本例中,由于标题相同,如果我在左栏中选择一个日期,一旦我按enter键,它将进入右侧的dates栏并被保存,这很好。我只是希望他们是同一个专栏

有什么想法吗


如果您不必自动生成列,有很多解决方案,但我必须允许动态添加和删除列,因此没有办法解决

以下是有效的方法:

C

内部公共部分类主窗口:窗口

外部公共部分类主窗口:窗口

克马尔

对于datatemplate:

<Window.Resources>
    <ResourceDictionary>

        <DataTemplate x:Key="datePickerTemplate">
            <DatePicker Text="{Binding}"
                ></DatePicker>
        </DataTemplate>

    </ResourceDictionary>
</Window.Resources>
这是我对datagrid的XMAL

            <DataGrid ItemsSource="{Binding}" AutoGenerateColumns="True" 
                      AutoGeneratingColumn="addColumnTemplates">
            </DataGrid>

如果您不必自动生成列,有很多解决方案,但我必须允许动态添加和删除列,因此没有办法解决

以下是有效的方法:

C

内部公共部分类主窗口:窗口

外部公共部分类主窗口:窗口

克马尔

对于datatemplate:

<Window.Resources>
    <ResourceDictionary>

        <DataTemplate x:Key="datePickerTemplate">
            <DatePicker Text="{Binding}"
                ></DatePicker>
        </DataTemplate>

    </ResourceDictionary>
</Window.Resources>
这是我对datagrid的XMAL

            <DataGrid ItemsSource="{Binding}" AutoGenerateColumns="True" 
                      AutoGeneratingColumn="addColumnTemplates">
            </DataGrid>

我可能听起来很愚蠢。。。但你为什么要这么做。MVVM存在的原因是,您不会弄乱代码背后的UI元素。@user853710别担心,我尝试它可能很愚蠢。因为datatable是在代码中加载的,所以我不认为有一种使用XAML的方法可以做到这一点,但我可能错了。在构建项目之前,XAML被翻译成C。但这不是处理任何问题的好方法。好的,所以我可以在从数据库加载其余列之前将上面的DataGridTemplateColumn放入datagrid中,如何使该模板应用于按名称加载的特定列?我可能听起来很愚蠢。。。但你为什么要这么做。MVVM存在的原因是,您不会弄乱代码背后的UI元素。@user853710别担心,我尝试它可能很愚蠢。因为datatable是在代码中加载的,所以我不认为有一种使用XAML的方法可以做到这一点,但我可能错了。在构建项目之前,XAML被翻译成C。但这不是处理任何问题的好方法。好的,在从数据库加载其余列之前,我可以将上面的DataGridTemplateColumn放入datagrid中,如何使该模板应用于按名称加载的特定列?