以编程方式为 DataGrid 创建 WPF DataGridTemplateColumn
Posted
技术标签:
【中文标题】以编程方式为 DataGrid 创建 WPF DataGridTemplateColumn【英文标题】:Programmatically create WPF DataGridTemplateColumn for DataGrid 【发布时间】:2010-10-11 10:05:14 【问题描述】:我希望能够基于我的数据源以编程方式创建 DataGridTemplateColumns。例如,如果我的来源在特定列中有日期,我希望能够使用 Datepicker 控件。我知道这很容易在设计时使用 xaml 和 DataGridTemplateColumn 完成,但是,我将如何在运行时完成呢?
是我最好的选择 xamlreader.load 还是更传统的路线,例如:
Dim TempCol As Microsoft.Windows.Controls.DataGridTemplateColumn
我对后者没有任何成功。
谢谢。
-保罗
编辑: 这是我尝试使用的代码:
Dim TempCol As New Microsoft.Windows.Controls.DataGridTemplateColumn
TempCol.CellEditingTemplate = DataTemplate.Equals(DatePicker)
我收到 DatePicker 是一种类型,不能用作表达式。
我基于 WPF 工具包演示。 http://windowsclient.net/wpf/wpf35/wpf-35sp1-toolkit-datagrid-feature-walkthrough.aspx
<dg:DataGridTemplateColumn Header="Date" MinWidth="100">
<dg:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<dg:DatePicker SelectedDate="Binding Date" SelectedDateFormat="Short" />
</DataTemplate>
</dg:DataGridTemplateColumn.CellEditingTemplate>
<dg:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="Binding Date, StringFormat=d" />
</DataTemplate>
</dg:DataGridTemplateColumn.CellTemplate>
</dg:DataGridTemplateColumn>
谢谢!
【问题讨论】:
您能否发布您用于生成模板列的确切代码? 如果我应该添加其他内容,请告诉我。谢谢。 【参考方案1】:您的代码不起作用的原因是因为您将CellEditingTemplate
列的值设置为bool
(调用DataTemplate.Equals()
的结果,而不是在代码中创建模板的实例。
您可以使用类似这样的代码在代码中创建模板(相当于您提供的 XAML 代码 sn-p):
DataGridTemplateColumn col = new DataGridTemplateColumn();
col.Header = "Date";
// Create a factory. This will create the controls in each cell of this
// column as needed.
FrameworkElementFactory factory =
new FrameworkElementFactory(typeof(DatePicker));
// Bind the value of this cell to the value of the Date property of the
// DataContext of this row. The StringFormat "d" will be used to display
// the value.
Binding b = new Binding("Date");
b.StringFormat = "d";
factory.SetValue(DatePicker.SelectedDateProperty, b);
// Create the template itself, and add the factory to it.
DataTemplate cellEditingTemplate = new DataTemplate();
cellEditingTemplate.VisualTree = factory;
col.CellEditingTemplate = cellEditingTemplate;
我不确定这种方法是否比自己加载 XAML 更有效。也许尝试两种方法,看看哪一种最适合您,并且效果更快?
【讨论】:
安迪,感谢您的回答。我的印象是将来不会支持 FrameworkElementFactory。请参阅此答案作为参考。 ***.com/questions/617052/… 再次感谢,-Paul 我还没有听说过这种方式。听起来 XamlReader 可能是要走的路。以上是关于以编程方式为 DataGrid 创建 WPF DataGridTemplateColumn的主要内容,如果未能解决你的问题,请参考以下文章
WPF DataGrid - 以编程方式将单元格设置为编辑模式
如何在 WPF 的 Datagrid 中设置以编程方式生成的 ComboBox 的启用属性?