Maison >développement back-end >C++ >Comment lier un nombre dynamique de colonnes à un DataGrid WPF ?
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>
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>
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>
<code class="language-csharp">public ObservableCollection<DataGridColumn> ColumnCollection { get; private set; }</code>
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>
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!