2009-11-18 37 views
3

我能夠重新創建XAML DataGridTextColumn如何以編程方式創建WPF Toolkit DataGridTemplateColumn?

<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 ...??? 

答:

謝謝阿蘭,只是指在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); 

回答

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。使用FrameworkElementFactory創建數據模板

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

是繁瑣的,在最好的,你永遠不知道他們什麼時候這麼爲你的預期你的行爲是沒有定義改變的東西在框架(不能記得我讀了,對不起)。我唯一使用它的時候是當我創建一個只有內容控件的數據模板時。然後我使用標準數據模板來顯示該內容控件中的對象。但使用它通常是一種破解。

+0

好主意,工作出色,併產生更清潔的代碼,謝謝! – 2009-11-23 13:25:51

+0

很高興它的工作,如果它是標記爲回答。 – 2009-11-23 22:24:03

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在運行時添加複選框。 希望這有助於!

+2

我喜歡變量命名 – Karsten 2011-10-17 12:30:58

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); 
} 
相關問題