以编程方式为 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 - 以编程方式将单元格设置为编辑模式

如何在 WPF 的 Datagrid 中设置以编程方式生成的 ComboBox 的启用属性?

如何使用 MVVM 应用程序在 WPF 中以编程方式设置 DataGrid 的选定项?

以编程方式在 WPF DataGrid 中选择多行

wpf 以编程方式设置排序,以便将标题切换为已排序