【发布时间】:2015-03-18 02:02:07
【问题描述】:
有几篇文章解释了如何在 DataGrid DatePickers、DatePickers 或 DateTimePickers 中创建特定列,但它们都是通过 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>
导致:
有没有办法在 C# 中做?
我从 SQL 数据库输入一个 DataTable 并将它绑定到一个 DataGrid。像这样:
dataGrid.DataContext = dataTable.AsDataView();
// or maybe dataGrid.ItemsSource = dataTable.DefaultView;
// I'm not sure what the difference is
我的 XAML 看起来像这样:
<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);
或
DatePicker dp = new DatePicker();
dp.SelectedDate = DateTime.Today;
dataTable.Rows[0][14] = dp;
但是这些最终只是作为单元格中的日期字符串,而不是 DatePicker 输入类型?有没有办法做到这一点?比如
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 中的日期列像这样taskTable.DataContext = dataTable.DefaultView; 我能否以某种方式使日期列与 C# 中的 DataTable 中的数据在 XAML 中的模板下的日期相同?
在这个例子中,因为标题是相同的,如果我在左边的栏中选择一个日期,一旦我按下回车,它就会进入右边的日期栏并被保存,这很好。我只是希望它们是同一列。
有什么想法吗?
【问题讨论】:
-
我可能听起来很愚蠢,......但你为什么要这样做。 MVVM 存在的原因是你不要在后面的代码中乱用 UI 元素。
-
@user853710 不用担心,我可能会因为尝试它而变得愚蠢。由于数据表是在代码中加载的,所以我认为没有办法使用 XAML 来实现,但我可能错了。
-
有办法的。在构建项目之前,XAML 被翻译成 C#。但这不是处理任何问题的好方法。
-
好的,所以我可以在从数据库加载其余列之前将上面的
DataGridTemplateColumn放在数据网格中,如何使该模板应用于按名称加载的特定列?
标签: c# wpf datagrid datatable datepicker