You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 19:43:09