WPF DataGrid: Ikat bilangan lajur secara dinamik
Soalan:
Aplikasi WPF menjana set data dengan bilangan lajur yang berubah-ubah, perihalan lajur yang diperlukan disertakan dalam output. Kod untuk mencipta lajur secara pemrograman melibatkan pengikatan menggunakan pemformatan rentetan, contohnya:
<code class="language-csharp">dataGrid.Columns.Add(new DataGridTextColumn { Header = data.ColumnDescriptions[i].Name, Binding = new Binding(string.Format("[{0}]", i)) });</code>
Matlamatnya adalah untuk menggantikan kod ini dengan pengikatan data dalam fail XAML.
Penyelesaian:
Harta Lajur DataGrid ialah baca sahaja dan tidak boleh terikat secara langsung. Walau bagaimanapun, sifat tambahan yang dipanggil BindableColumns boleh digunakan sebagai penyelesaian:
<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>
Dalam fail XAML, ikat sifat BindableColumns ke koleksi lajur:
<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>
Kaedah BindableColumnsPropertyChanged mengemas kini sifat Columns apabila koleksi terikat berubah:
<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>
Kaedah ini mendengar perubahan koleksi (tambah, padam, ganti) dan mengemas kini sifat Lajur dengan sewajarnya. Perlu diingat bahawa dalam kaedah BindableColumnsPropertyChanged
, pemerolehan tika dataGrid
ditambah dan peristiwa perubahan koleksi diproses dengan lebih lengkap untuk memastikan kemas kini lajur disegerakkan.
Atas ialah kandungan terperinci Bagaimana untuk Mengikat Nombor Dinamik Lajur ke WPF DataGrid?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!