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
Libérer: 2025-01-22 08:16:14
original
203 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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

<code class="language-csharp">columns.CollectionChanged += (sender, e2) =>
{
    // ...
};</code>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal