Программно связать DataGridTemplateColumn - PullRequest
3 голосов
/ 12 января 2012

Вот мой код:

foreach (var columnData in lookup.DataProvider.Metadata)
    {
        DataGridColumn column = new DataGridTextColumn { Binding = new Binding(columnData.FieldName) };

        if (columnData.DataType == typeof(bool))
        {
            column = new DataGridCheckBoxColumn { Binding = new Binding(columnData.FieldName) };
        }

        if (columnData.DataType == typeof(DateTime))
        {
            column = new DataGridTemplateColumn();
            //... ????
        }

        column.Header = columnData.Caption;

        DataDataGrid.Columns.Add(column);
    }

В основном я создаю столбцы и привязки в коде, потому что столбцы не известны во время разработки.

Теперь мне нужно добавить шаблонный столбеци не уверен, как написать это в C #.Вот пример XAML столбца, который мне нужно добавить:

<sdk:DataGridTemplateColumn Header="Received" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Width="Auto" SortMemberPath="SomeTime">
    <sdk:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <MyControls:MyDateTimeLabel DisplayUtcDate="{Binding SomeTime}" />
        </DataTemplate>
    </sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>

РЕДАКТИРОВАТЬ

В случае, если кто-то заинтересован.Я использовал решение отсюда: http://www.pettijohn.com/2011/01/silverlight-datagrid-with-dynamic.html

Я взял версию с загрузчиком XAML.Это определенно пахнет, так как мои пространства имен и т. Д. Жестко закодированы в строки.

Итак, я начал исследовать второй вариант.Вот как выглядит мой динамический столбец:

column = new DataGridTemplateColumn
            {
                CanUserSort = true,
                SortMemberPath = columnData.FieldName,
                CellTemplate = (DataTemplate)this.Resources["DateTimeColumnDataTemplate"]
            };

Я загружаю DateTemplate из ресурсов.Это было круто, но как мне связать?Здесь было предложено добраться до моего DateTimeLabel и установить привязку.Но это не сработало (см. Статью о том, почему).Итак, я написал этот код и все хорошо:

private void OnLoadingRow(object sender, DataGridRowEventArgs e)
    {
        foreach (DataGridColumn t in this.DataDataGrid.Columns)
        {
            if (t is DataGridTemplateColumn)
            {
                var label = t.GetCellContent(e.Row) as DitatDateTimeLabel;
                label.SetBinding(DitatDateTimeLabel.DisplayUtcDateProperty, new Binding(t.SortMemberPath));
            }
        }
    }

1 Ответ

2 голосов
/ 12 января 2012

Вы можете поместить свои DataTemplate в Page / UserControl ресурсы, извлечь их в коде и применить к CellTemplate вашего столбца. Это будет выглядеть так:

column.CellTemplate = (DataTemplate)this.Resources["DateTimeFieldTemplate"];

Привязка должна работать как сейчас в вашем DataTemplate XAML, потому что на уровне строки DataGrid ваш DataContext будет установлен на сам элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...