Программно создать WPF DataGridTemplateColumn для DataGrid - PullRequest
2 голосов
/ 05 марта 2009

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

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

Dim TempCol As Microsoft.Windows.Controls.DataGridTemplateColumn

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

Спасибо.

-Поль

Edit: Вот код, который я пытался использовать:

        Dim TempCol As New Microsoft.Windows.Controls.DataGridTemplateColumn

    TempCol.CellEditingTemplate = DataTemplate.Equals(DatePicker)

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

Я основываю это на демонстрационном наборе инструментов WPF. 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>

Спасибо!

1 Ответ

4 голосов
/ 09 марта 2009

Причина, по которой ваш код не работает, заключается в том, что вы задаете для столбца 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 самостоятельно. Может быть, попробовать оба подхода и посмотреть, какой из них лучше подходит для вас, и работает быстрее?

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