Программное создание WPF DataGridTemplateColumn для DataGrid

Я хотел бы иметь возможность программно создавать DataGridTemplateColumns на основе моего источника данных. Например, если в моем источнике есть дата в определенном столбце, я хотел бы иметь возможность использовать элемент управления Datepicker. Я знаю, что это легко сделать с помощью xaml и DataGridTemplateColumn во время разработки, однако как мне это сделать во время выполнения?

Мой лучший вариант xamlreader.load или более традиционный маршрут, например:

Dim TempCol As Microsoft.Windows.Controls.DataGridTemplateColumn

У меня не было никакого успеха с последним.

Спасибо.

-Павел

Изменить: это код, который я пытался использовать:

        Dim TempCol As New Microsoft.Windows.Controls.DataGridTemplateColumn

    TempCol.CellEditingTemplate = DataTemplate.Equals(DatePicker)

Я получаю, что DatePicker — это тип, который нельзя использовать как выражение.

Я основываюсь на демонстрации WPF Toolkit. http://windowsclient.net/wpf/wpf35/wpf-35sp1-toolkit-datagrid-feature-walkthrough.aspx

<dg:DataGridTemplateColumn Header="Date" MinWidth="100">
    <dg:DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <dg:DatePicker SelectedDate="{Binding Date}" SelectedDateFormat="Short" />
        </DataTemplate>
    </dg:DataGridTemplateColumn.CellEditingTemplate>
    <dg:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Date, StringFormat=d}" />
        </DataTemplate>
    </dg:DataGridTemplateColumn.CellTemplate>
</dg:DataGridTemplateColumn>

Спасибо!


person PaulWaldman    schedule 05.03.2009    source источник
comment
Не могли бы вы опубликовать точный код, который вы использовали для создания столбца шаблона?   -  person Andy    schedule 06.03.2009
comment
Дайте мне знать, если я должен добавить что-нибудь еще. Спасибо.   -  person PaulWaldman    schedule 07.03.2009


Ответы (1)


Причина, по которой ваш код не работает, заключается в том, что вы устанавливаете значение столбца CellEditingTemplate в bool (результат вызова DataTemplate.Equals(), а не создаете экземпляр шаблона в коде.

Вы можете создать шаблон в коде, используя что-то вроде этого (эквивалент предоставленного вами фрагмента кода XAML):

DataGridTemplateColumn col = new DataGridTemplateColumn();
col.Header = "Date";

// Create a factory. This will create the controls in each cell of this
// column as needed.
FrameworkElementFactory factory =
    new FrameworkElementFactory(typeof(DatePicker));

// Bind the value of this cell to the value of the Date property of the
// DataContext of this row. The StringFormat "d" will be used to display
// the value.
Binding b = new Binding("Date");
b.StringFormat = "d";
factory.SetValue(DatePicker.SelectedDateProperty, b);

// Create the template itself, and add the factory to it.
DataTemplate cellEditingTemplate = new DataTemplate();
cellEditingTemplate.VisualTree = factory;

col.CellEditingTemplate = cellEditingTemplate;

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

person Andy    schedule 09.03.2009
comment
Энди, спасибо за ваш ответ. У меня сложилось впечатление, что FrameworkElementFactory не будет поддерживаться в будущем. См. этот ответ в качестве ссылки. stackoverflow.com/questions/617052/ Еще раз спасибо, - Пол - person PaulWaldman; 09.03.2009
comment
Я не слышал об этом так или иначе. Похоже, XamlReader может быть подходящим вариантом. - person Andy; 09.03.2009