понедельник, 19 ноября 2012 г.

Создание DataTemplate из кода

Время от времени, возникали задачи, в которых можно было бы применить DataTemplate, вот только пришлось бы генерировать его из кода. До сегодняшнего дня, я в основном придумывал другое решение, которое решало бы задачу без генерации DataTemplate. Ну а сегодня решил разобраться как все таки это делать.
Сразу оговорюсь, рассмотриваемую задачу можно решить и без генерации DataTemplate, но т.к. мы говорим именно об этом, то уж не обессутьте.
Для простоты, у меня будет отображаться только один столбец, а в качестве источника данных, я возьму массив целых чисел.
Разметка окна самая что ни на есть простая:
<Grid>
    <DataGrid x:Name="dgMatrix" />
</Grid>
Ну и код:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Loaded += new RoutedEventHandler(MainWindow_Loaded);
    }

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        // Устанавливаем источник данных
        dgMatrix.ItemsSource = new int[] { 1, 2, 4, 5, 7, 8, 12 };
        // Создаем шаблон, по которому будет строится DataTemplate
        FrameworkElementFactory fefTextBlock = new FrameworkElementFactory(typeof(TextBlock));
        fefTextBlock.SetBinding(TextBlock.TextProperty, new Binding());
        fefTextBlock.SetValue(TextBlock.TextAlignmentProperty, TextAlignment.Right);
        fefTextBlock.SetValue(TextBlock.ForegroundProperty, new SolidColorBrush(Colors.Green));
        // Создаем столбец
        DataGridTemplateColumn column = new DataGridTemplateColumn();
        // Создаем DataTemplate, указав шаблон для его визуального дерева
        column.CellTemplate = new DataTemplate { VisualTree = fefTextBlock };
        dgMatrix.Columns.Add(column);
    }
}

Единственно, я не нашел, как назначать присоединенные свойства, а без них ни Grid-ом, ни DockPanelom отформатировать не получится... А, ну и еще у FrameworkElementFactory есть динамический метод AppendChild, при помощи которого, если FrameworkElementFactory создан на основе компонента-контейнера, в него можно добавить дочерние элементы.

Комментариев нет:

Отправить комментарий