如何通过编程方式创建WPF Toolkit DataGridTemplateColumn?

3

我能够重新创建这个XAML DataGridTextColumn

<tk:DataGridTextColumn
    Binding="{Binding FirstName}"
    Header="First Name"/>

像这样的代码

DataGridTextColumn dgtc = new DataGridTextColumn();
dgtc.Header = propertyLabel;
dgtc.Binding = new Binding(propertyName);
theDataGrid.Columns.Add(dgtc);

但是我该如何使用代码重新创建以下DataGridTemplateColumn呢?

<tk:DataGridTemplateColumn Width="100">
    <tk:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock Style="{DynamicResource ManageLinkStyle}"
                    Tag="{Binding Id}" Text="Delete" MouseDown="System_Delete_Click"/>
                <TextBlock Text=" "/>
                <TextBlock Style="{DynamicResource ManageLinkStyle}"
                           Tag="{Binding Id}" Text="Edit" MouseDown="System_Edit_Click"/>
            </StackPanel>
        </DataTemplate>
    </tk:DataGridTemplateColumn.CellTemplate>
</tk:DataGridTemplateColumn>

即我在定义CellTemplate方面遇到了困难:
DataGridTemplateColumn dgTemplateColumn = new DataGridTemplateColumn();
dgTemplateColumn.CellTemplate = new CellTemplate ...???

答案:

谢谢Aran,参考XAML中的模板键对我所需的内容很好用,以下是我如何更改上述内容使其适合我使用:

XAML:

<Window.Resources>
    <DataTemplate x:Key="manageAreaCellTemplate">
        <StackPanel Orientation="Horizontal">
            <TextBlock Style="{DynamicResource ManageLinkStyle}"
        Tag="{Binding Id}" Text="Delete" MouseDown="System_Delete_Click"/>
            <TextBlock Text=" "/>
            <TextBlock Style="{DynamicResource ManageLinkStyle}"
               Tag="{Binding Id}" Text="Edit" MouseDown="System_Edit_Click"/>
        </StackPanel>
    </DataTemplate>
</Window.Resources>

后台代码:

DataGridTemplateColumn dgTemplateColumn = new DataGridTemplateColumn();
dgTemplateColumn.Width = new DataGridLength(1, DataGridLengthUnitType.Star);
dgTemplateColumn.Header = "Manage Options";
dgTemplateColumn.CellTemplate = this.FindResource("manageAreaCellTemplate") as DataTemplate;
theDataGrid.Columns.Add(dgTemplateColumn);
3个回答

4

使用这个:

DataGridTemplateColumn col1 = new DataGridTemplateColumn();
col1.Header = "MyHeader";
FrameworkElementFactory factory1 = new FrameworkElementFactory(typeof(CheckBox));
Binding b1 = new Binding("IsSelected");
b1.Mode = BindingMode.TwoWay;
factory1.SetValue(CheckBox.IsCheckedProperty, b1);
factory1.AddHandler(CheckBox.CheckedEvent, new RoutedEventHandler(chkSelect_Checked));
DataTemplate cellTemplate1 = new DataTemplate();
cellTemplate1.VisualTree = factory1;
col1.CellTemplate = cellTemplate1;
dgTransportReqsts.DataGrid.Columns.Add(col1);

我在运行时使用这个方法在我的DataGridTemplateColumn中添加了复选框。 希望这能对你有所帮助!

4

您是否同意仍然在XAML中定义单元格模板?

那么您可以定义它。

<DataTemplate x:Key="myCellTemplateKey">
    <StackPanel Orientation="Horizontal">
        <TextBlock Style="{DynamicResource ManageLinkStyle}"
            Tag="{Binding Id}" Text="Delete" MouseDown="System_Delete_Click"/>
        <TextBlock Text=" "/>
        <TextBlock Style="{DynamicResource ManageLinkStyle}"
                   Tag="{Binding Id}" Text="Edit" MouseDown="System_Edit_Click"/>
    </StackPanel>
</DataTemplate>

当您创建XAML时,可以从代码后台引用它。

dgTemplateColumn.CellTemplate = this.FindResource("myCellTemplateKey") as DataTemplate;

使用FrameworkElementFactory创建数据模板最好时很麻烦的,而且你永远不知道他们何时会更改框架,以至于你的行为不如你所期望(我忘记在哪里读到了,抱歉)。我仅在创建仅包含内容控件的数据模板时使用它。然后我使用标准数据模板将对象显示在该内容控件中。但通常使用它是一种hack。


好主意,运行得非常出色,而且生成的代码更加清晰,谢谢! - Edward Tanguay

1

FrameworkElementFactory 已经有点过时了。

private DataTemplate CreateCellTemplate()
{
   string xaml = @"
   <DataTemplate
   xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>
  <StackPanel>
      <TextBlock Text='HelloTestmaster'/>
   </StackPanel>
    </DataTemplate>
   ";
   StringReader stringReader = new StringReader(xaml);
   XmlReader xmlReader = XmlReader.Create(stringReader);
   return (DataTemplate)XamlReader.Load(xmlReader);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接