Dynamische Bindung von Spalten in WPF DataGrid
Die Columns-Eigenschaft des WPF DataGrid ist schreibgeschützt, was beim Versuch, Daten mit einer variablen Anzahl von Spalten programmgesteuert zu binden, zu Herausforderungen führt.
Stellen Sie sich das folgende Szenario vor:
<code class="language-csharp">class Data { public IList<ColumnDescription> ColumnDescriptions { get; set; } public string[][] Rows { get; set; } }</code>
Um diese Daten im DataGrid anzuzeigen, müssen die Spalten dynamisch generiert werden:
<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>
Ist es möglich, diesen Code durch Datenbindung in der XAML-Datei zu ersetzen?
Lösung: BindableColumns angehängte Attribute
Während die Columns-Eigenschaft weiterhin schreibgeschützt ist, kann eine zusätzliche Eigenschaft namens BindableColumns erstellt werden:
<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>
Sie können dann die BindableColumns-Eigenschaft an die ObservableCollection von DataGridColumn-Objekten in XAML binden:
<code class="language-xml"><DataGrid Name="dataGrid"> local:DataGridColumnsBehavior.BindableColumns="{Binding ColumnCollection}" AutoGenerateColumns="False" ... /></code>
Anwendung
Um das BindableColumns-Verhalten zu verwenden, definieren Sie eine ObservableCollection von DataGridColumn-Objekten:
<code class="language-csharp">public ObservableCollection<DataGridTextColumn> ColumnCollection { get; private set; }</code>
Und aktualisieren Sie die Spalte dynamisch über das CollectionChanged-Ereignis:
<code class="language-csharp">columns.CollectionChanged += (sender, e2) => { // ... };</code>
Diese Problemumgehung ermöglicht die Datenbindung von Spalten im DataGrid, ohne die schreibgeschützte Columns-Eigenschaft zu ändern.
Das obige ist der detaillierte Inhalt vonWie binde ich Spalten mithilfe von XAML dynamisch an ein WPF-DataGrid?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!