WPF技术问询:如何将DataGrid中字典的键值对传给自定义控件
解决方案
要把字典的键值对传递给RefactorListItemControl的Data属性,核心是将KeyValuePair<string, List<RefactorOperation>>转换为控件所需的RefactorListData类型,以下是几种可行的实现方式:
方式一:给RefactorListData添加构造函数,直接在绑定中实例化
首先修改RefactorListData类,添加接收键和值的构造函数:
public class RefactorListData { public string Filename { get; set; } public List<RefactorOperation> Operations { get; set; } // 添加构造函数 public RefactorListData(string filename, List<RefactorOperation> operations) { Filename = filename; Operations = operations; } }
然后在XAML的绑定中,直接构造RefactorListData并赋值:
<DataGrid ItemsSource="{Binding RefactorOperations}"> <DataGrid.Columns> <DataGridTemplateColumn> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <custom:RefactorListItemControl> <custom:RefactorListItemControl.Data> <local:RefactorListData Filename="{Binding Key}" Operations="{Binding Value}" /> </custom:RefactorListItemControl.Data> </custom:RefactorListItemControl> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid>
方式二:使用IValueConverter转换键值对
创建一个转换器,将KeyValuePair<string, List<RefactorOperation>>转换为RefactorListData:
public class KeyValuePairToRefactorListDataConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value is KeyValuePair<string, List<RefactorOperation>> kvp) { return new RefactorListData { Filename = kvp.Key, Operations = kvp.Value }; } return null; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }
在XAML中声明转换器资源并使用:
<Window.Resources> <local:KeyValuePairToRefactorListDataConverter x:Key="KvpToRefactorDataConverter" /> </Window.Resources> <DataGrid ItemsSource="{Binding RefactorOperations}"> <DataGrid.Columns> <DataGridTemplateColumn> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <custom:RefactorListItemControl Data="{Binding Converter={StaticResource KvpToRefactorDataConverter}}"> </custom:RefactorListItemControl> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid>
方式三:在ViewModel中预先转换数据
直接在ViewModel层将字典转换为List<RefactorListData>,避免在视图层处理类型转换:
// 在ViewModel中添加新属性 public List<RefactorListData> RefactorListDataItems { get; set; } // 初始化时转换字典 RefactorOperations = new Dictionary<string, List<RefactorOperation>>(); // ... 添加字典数据 RefactorListDataItems = RefactorOperations.Select(kvp => new RefactorListData { Filename = kvp.Key, Operations = kvp.Value }).ToList();
然后修改DataGrid的绑定源:
<DataGrid ItemsSource="{Binding RefactorListDataItems}"> <DataGrid.Columns> <DataGridTemplateColumn> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <custom:RefactorListItemControl Data="{Binding}"></custom:RefactorListItemControl> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid>
这三种方式中,方式三更符合MVVM架构的设计原则,将数据转换逻辑放在ViewModel层,视图只负责展示;如果不想修改ViewModel,方式二的转换器方案也很灵活。
内容的提问来源于stack exchange,提问作者pf12345678910
相关产品推荐
相关产品推荐

