在WPF DataGrid中動態綁定列
WPF DataGrid的Columns屬性是唯讀的,這在嘗試以可變列數程式設計方式綁定資料時帶來了挑戰。
考慮以下場景:
<code class="language-csharp">class Data { public IList<ColumnDescription> ColumnDescriptions { get; set; } public string[][] Rows { get; set; } }</code>
要在DataGrid中顯示此數據,必須動態產生列:
<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>
是否可以在XAML檔案中用資料綁定取代此程式碼?
解:BindableColumns 附加屬性
雖然Columns屬性仍然是唯讀的,但可以建立一個名為BindableColumns的附加屬性:
<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>
然後,可以在XAML中將BindableColumns屬性綁定到DataGridColumn物件的ObservableCollection:
<code class="language-xml"><DataGrid Name="dataGrid"> local:DataGridColumnsBehavior.BindableColumns="{Binding ColumnCollection}" AutoGenerateColumns="False" ... /></code>
使用方法
要使用BindableColumns行為,請定義一個DataGridColumn物件的ObservableCollection:
<code class="language-csharp">public ObservableCollection<DataGridTextColumn> ColumnCollection { get; private set; }</code>
並透過CollectionChanged事件動態更新列:
<code class="language-csharp">columns.CollectionChanged += (sender, e2) => { // ... };</code>
此變通方法允許在DataGrid中進行列的資料綁定,而無需修改唯讀Columns屬性。
以上是如何使用 XAML 將列動態綁定到 WPF DataGrid?的詳細內容。更多資訊請關注PHP中文網其他相關文章!