Изменение содержимого метки программно из DataTemplate, используемого в заголовке столбца DataGrid - PullRequest
0 голосов
/ 11 ноября 2011

Я динамически создаю столбцы DataGrid (на основе события из моей ViewModel) и программно добавляю их в существующую DataGrid. В каждом столбце используется универсальный шаблон HeaderTemplate, для которого устанавливается значение DataTemplate, идентифицированное в xaml. DataTemplate содержит две метки, в которых необходимо изменить их содержимое при создании столбца DataGrid. Как это будет сделано? Я понимаю, что DataTemplate использует ContentPresenter, но у меня возникают проблемы с доступом к нему в динамически создаваемом столбце DataGrid. Код выглядит следующим образом:

xaml: (шаблон, используемый для форматирования заголовка столбца DataGrid):

    <DataTemplate x:Key="columnTemplate">
        <StackPanel>
            <Label Padding="0" Name="labelA"/>
            <Separator HorizontalAlignment="Stretch"/>
            <Label Padding="0" Name="labelB"/>
        </StackPanel>
    </DataTemplate>

c #: (используется для динамического создания столбца DataGrid и добавления его в существующий DataGrid)

            var dataTemplate = FindResource("columnTemplate") as DataTemplate;
            var column = new DataGridTextColumn();

            column.HeaderTemplate = dataTemplate;
            DataGrid1.Columns.Add(column);

Я бы хотел получить доступ к labelA и labelB и изменить содержимое.

1 Ответ

1 голос
/ 11 ноября 2011

Вы не можете изменять содержимое шаблона во время выполнения, если вы не хотите, чтобы каждый элемент, использующий этот шаблон, также изменял его содержимое.

В вашей ситуации я бы просто создал заголовок по мере необходимости. Вы можете сделать это проще, поместив код для создания заголовка в свой собственный метод.

public void AddColumnHeader(DataGridTextColumn column, string header1, string header2)
{
    var panel = new StackPanel();

    var labelA = new Label();
    labelA.Content = header1;
    panel.Children.Add(labelA);

    var separator = new Separator();
    separator.HorizontalAlignment = HorizontalAlignment.Stretch;
    panel.Children.Add(separator);

    var labelB = new Label();
    labelB.Content = header2;
    panel.Children.Add(labelB);

    column.Header = panel;
}

Затем, чтобы применить свой заголовок, просто используйте

var column = new DataGridTextColumn();
AddColumnHeader(column);
DataGrid1.Columns.Add(column, "label content 1", "label content 2");
...