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