在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中文网其他相关文章!