Maison > développement back-end > C++ > Comment lier un nombre dynamique de colonnes à un DataGrid WPF ?

Comment lier un nombre dynamique de colonnes à un DataGrid WPF ?

Susan Sarandon
Libérer: 2025-01-22 08:33:13
original
152 Les gens l'ont consulté

How to Bind a Dynamic Number of Columns to a WPF DataGrid?

WPF DataGrid : lier dynamiquement le nombre de colonnes

Question :

Une application WPF génère un ensemble de données avec un nombre variable de colonnes, les descriptions de colonnes requises sont incluses dans la sortie. Le code permettant de créer des colonnes par programme implique une liaison à l'aide d'un formatage de chaîne, par exemple :

<code class="language-csharp">dataGrid.Columns.Add(new DataGridTextColumn
{
    Header = data.ColumnDescriptions[i].Name,
    Binding = new Binding(string.Format("[{0}]", i))
});</code>
Copier après la connexion

L'objectif est de remplacer ce code par la liaison de données dans le fichier XAML.

Solution :

La propriété Columns de DataGrid est en lecture seule et ne peut pas être liée directement. Cependant, une propriété supplémentaire appelée BindableColumns peut être utilisée comme solution de contournement :

<code class="language-csharp">public class DataGridColumnsBehavior
{
    // 附加属性,绑定到DataGridColumn集合
    public static readonly DependencyProperty BindableColumnsProperty =
        DependencyProperty.RegisterAttached("BindableColumns",
                                            typeof(ObservableCollection<DataGridColumn>),
                                            typeof(DataGridColumnsBehavior),
                                            new UIPropertyMetadata(null, BindableColumnsPropertyChanged));
}</code>
Copier après la connexion

Dans le fichier XAML, liez la propriété BindableColumns à la collection de colonnes :

<code class="language-xml"><DataGrid ... AutoGenerateColumns="False" local:DataGridColumnsBehavior.BindableColumns="{Binding ColumnCollection}" Name="dataGrid"></DataGrid></code>
Copier après la connexion
<code class="language-csharp">public ObservableCollection<DataGridColumn> ColumnCollection
{
    get;
    private set;
}</code>
Copier après la connexion

La méthode BindableColumnsPropertyChanged met à jour la propriété Columns lorsque la collection liée change :

<code class="language-csharp">private static void BindableColumnsPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
{
    DataGrid dataGrid = source as DataGrid; // 获取DataGrid实例

    // 清除现有列
    dataGrid.Columns.Clear();

    ObservableCollection<DataGridColumn> columns = e.NewValue as ObservableCollection<DataGridColumn>;
    if (columns == null)
    {
        return;
    }

    // 添加新列
    foreach (DataGridColumn column in columns)
    {
        dataGrid.Columns.Add(column);
    }

    // 处理集合更改
    columns.CollectionChanged += (sender, e2) =>
    {
        // ...  处理集合变化,例如重新绑定列
        dataGrid.Columns.Clear();
        foreach (DataGridColumn column in columns)
        {
            dataGrid.Columns.Add(column);
        }
    };
}</code>
Copier après la connexion

Cette méthode écoute les modifications de la collection (ajout, suppression, remplacement) et met à jour la propriété Columns en conséquence. Il convient de noter que dans la méthode BindableColumnsPropertyChanged, l'acquisition de l'instance dataGrid est ajoutée et l'événement de changement de collection est traité plus complètement pour garantir la synchronisation des mises à jour des colonnes.

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