Maison >développement back-end >C++ >Comment lier dynamiquement des colonnes à un DataGrid WPF à l'aide de XAML ?

Comment lier dynamiquement des colonnes à un DataGrid WPF à l'aide de XAML ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-22 08:16:14221parcourir

How to Dynamically Bind Columns to a WPF DataGrid using XAML?

Liaison dynamique des colonnes dans WPF DataGrid

La propriété Columns de WPF DataGrid est en lecture seule, ce qui crée des défis lorsque l'on tente de lier par programme des données avec un nombre variable de colonnes.

Considérez le scénario suivant :

<code class="language-csharp">class Data
{
    public IList<ColumnDescription> ColumnDescriptions { get; set; }
    public string[][] Rows { get; set; }
}</code>

Pour afficher ces données dans le DataGrid, les colonnes doivent être générées dynamiquement :

<code class="language-csharp">for (int i = 0; i < data.ColumnDescriptions.Count; i++)
{
    dataGrid.Columns.Add(new DataGridTextColumn
    {
        Header = data.ColumnDescriptions[i].Name,
        Binding = new Binding(string.Format("[{0}]", i))
    });
}</code>

Est-il possible de remplacer ce code par une liaison de données dans le fichier XAML ?

Solution : attributs attachés de BindableColumns

Bien que la propriété Columns soit toujours en lecture seule, une propriété supplémentaire appelée BindableColumns peut être créée :

<code class="language-csharp">public class DataGridColumnsBehavior
{
    public static readonly DependencyProperty BindableColumnsProperty =
        DependencyProperty.RegisterAttached("BindableColumns",
                                            typeof(ObservableCollection<DataGridTextColumn>),
                                            typeof(DataGridColumnsBehavior),
                                            new UIPropertyMetadata(null, BindableColumnsPropertyChanged));
    // ...
}</code>

Vous pouvez ensuite lier la propriété BindableColumns à l'ObservableCollection des objets DataGridColumn en XAML :

<code class="language-xml"><DataGrid Name="dataGrid">
    local:DataGridColumnsBehavior.BindableColumns="{Binding ColumnCollection}"
    AutoGenerateColumns="False"
    ... /></code>

Comment utiliser

Pour utiliser le comportement BindableColumns, définissez une ObservableCollection d'objets DataGridColumn :

<code class="language-csharp">public ObservableCollection<DataGridTextColumn> ColumnCollection
{
    get;
    private set;
}</code>

Et mettez à jour dynamiquement la colonne via l'événement CollectionChanged :

<code class="language-csharp">columns.CollectionChanged += (sender, e2) =>
{
    // ...
};</code>

Cette solution de contournement permet la liaison des données des colonnes dans le DataGrid sans modifier la propriété Columns en lecture seule.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn