Время от времени, возникали задачи, в которых можно было бы применить DataTemplate, вот только пришлось бы генерировать его из кода. До сегодняшнего дня, я в основном придумывал другое решение, которое решало бы задачу без генерации DataTemplate. Ну а сегодня решил разобраться как все таки это делать.
Сразу оговорюсь, рассмотриваемую задачу можно решить и без генерации DataTemplate, но т.к. мы говорим именно об этом, то уж не обессутьте.
Для простоты, у меня будет отображаться только один столбец, а в качестве источника данных, я возьму массив целых чисел.
Разметка окна самая что ни на есть простая:
<Grid>
<DataGrid x:Name="dgMatrix" />
</Grid>
Ну и код:
public MainWindow()
{
InitializeComponent();
Loaded += new RoutedEventHandler(MainWindow_Loaded);
}
// Устанавливаем источник данных
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 создан на основе компонента-контейнера, в него можно добавить дочерние элементы.
Сразу оговорюсь, рассмотриваемую задачу можно решить и без генерации 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 создан на основе компонента-контейнера, в него можно добавить дочерние элементы.
Комментариев нет:
Отправить комментарий