WPF DataGrid: 列数を動的にバインドします
質問:
WPF アプリケーションは可変数の列を含むデータセットを生成し、必要な列の説明が出力に含まれます。プログラムで列を作成するコードには、文字列書式設定を使用したバインドが含まれます。例:
<code class="language-csharp">dataGrid.Columns.Add(new DataGridTextColumn { Header = data.ColumnDescriptions[i].Name, Binding = new Binding(string.Format("[{0}]", i)) });</code>
目標は、このコードを XAML ファイルのデータ バインディングに置き換えることです。
解決策:
DataGrid の Columns プロパティは読み取り専用であり、直接バインドできません。ただし、BindableColumns と呼ばれる追加プロパティを回避策として使用できます。
<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>
XAML ファイルで、BindableColumns プロパティを列コレクションにバインドします。
<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>
BindableColumnsPropertyChanged メソッドは、バインドされたコレクションが変更されると Columns プロパティを更新します。
<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>
このメソッドはコレクションの変更 (追加、削除、置換) をリッスンし、それに応じて Columns プロパティを更新します。 BindableColumnsPropertyChanged
メソッドでは、dataGrid
インスタンスの取得が追加され、列の更新が確実に同期されるようにコレクション変更イベントがより完全に処理されることに注意してください。
以上が動的列数を WPF DataGrid にバインドするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。