【问题标题】:How can I programatically create a WPF Toolkit DataGridTemplateColumn?如何以编程方式创建 WPF 工具包 DataGridTemplateColumn?
【发布时间】:2009-11-18 16:40:56
【问题描述】:

我能够重新创建此 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);

【问题讨论】:

    标签: c# wpf xaml datagrid wpftoolkit


    【解决方案1】:

    您是否仍然可以在 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】:

    使用这个:

    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。 希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      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);
      }
      

      【讨论】:

        猜你喜欢
        • 2010-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-18
        • 1970-01-01
        • 2012-11-28
        相关资源
        最近更新 更多