Как я могу программно создать WPF Toolkit DataGridTemplateColumn? - PullRequest
3 голосов
/ 18 ноября 2009

Мне удалось воссоздать этот 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 ...???

Ответ:

Спасибо, Аран, просто ссылка на ключ шаблона в 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 голосов
/ 21 ноября 2009

было бы приемлемо определить шаблон ячейки в 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 для создания шаблонов данных в лучшем случае неоправданно, и вы никогда не знаете, когда они собираются что-то изменить в рамках, поэтому ваше поведение не определено, как вы ожидали (не помню, где я это читал, извините) единственный раз, когда я использую его, когда я создаю шаблон данных, который имеет только элемент управления контентом. затем я использую стандартные шаблоны данных для отображения объекта в этом элементе управления контентом. но использовать его, как правило, взломать.

4 голосов
/ 18 ноября 2009

используйте это:

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

Я использовал это, чтобы добавить CheckBox в мой DataGridTemplateColumn во время выполнения. Надеюсь, это поможет !!

1 голос
/ 20 августа 2011

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