Heim >Backend-Entwicklung >C++ >Wie binde ich eine dynamische Anzahl von Spalten an ein WPF-DataGrid?
WPF DataGrid: Binden Sie die Anzahl der Spalten dynamisch
Frage:
Eine WPF-Anwendung generiert einen Datensatz mit einer variablen Anzahl von Spalten, die erforderlichen Spaltenbeschreibungen sind in der Ausgabe enthalten. Der Code zum programmgesteuerten Erstellen von Spalten beinhaltet die Bindung mithilfe einer Zeichenfolgenformatierung, zum Beispiel:
<code class="language-csharp">dataGrid.Columns.Add(new DataGridTextColumn { Header = data.ColumnDescriptions[i].Name, Binding = new Binding(string.Format("[{0}]", i)) });</code>
Ziel ist es, diesen Code durch die Datenbindung in der XAML-Datei zu ersetzen.
Lösung:
Die Columns-Eigenschaft von DataGrid ist schreibgeschützt und kann nicht direkt gebunden werden. Als Workaround kann jedoch eine zusätzliche Eigenschaft namens BindableColumns verwendet werden:
<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>
Binden Sie in der XAML-Datei die BindableColumns-Eigenschaft an die Spaltensammlung:
<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>
Die BindableColumnsPropertyChanged-Methode aktualisiert die Columns-Eigenschaft, wenn sich die gebundene Sammlung ändert:
<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>
Diese Methode wartet auf Sammlungsänderungen (Hinzufügen, Löschen, Ersetzen) und aktualisiert die Columns-Eigenschaft entsprechend. Es ist zu beachten, dass in der BindableColumnsPropertyChanged
-Methode die Erfassung der dataGrid
-Instanz hinzugefügt wird und das Sammlungsänderungsereignis vollständiger verarbeitet wird, um sicherzustellen, dass Spaltenaktualisierungen synchronisiert werden.
Das obige ist der detaillierte Inhalt vonWie binde ich eine dynamische Anzahl von Spalten an ein WPF-DataGrid?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!