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!