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

时间:2009-11-18 16:40:57

标签: c# wpf xaml datagrid wpftoolkit

我能够重新创建此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 个答案:

答案 0 :(得分: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中添加CheckBox。 希望这会有所帮助!!

答案 1 :(得分: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创建数据模板充其量是最好的,你永远不知道他们什么时候会改变框架中的某些东西,所以你的行为没有像你期望的那样定义(不记得我在哪里阅读,抱歉)。我使用它的唯一时间是我创建一个只有内容控件的数据模板。然后我使用标准数据模板来显示该内容控件中的对象。但使用它通常是一种黑客攻击。

答案 2 :(得分: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);
}