WPF MVVM 将字典<字符串,列表<字符串>> 绑定到数据网格

Cou*_*rlu 5 c# wpf xaml datagrid mvvm

我无法Dictionary<string, List<string>>使用正确的布局将我的 WPF 数据网格绑定到我的 WPF 数据网格。

这是我的数据对象:

public class Result
{
    public Result(string type, string name, Dictionary<string, List<string>> partners)
    {
        Type = type;
        Name = name;
        Partners = partners;
    }

    public string Type { get; set; }
    public string Name { get; set; }
    public Dictionary<string, List<string>> Partners { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我填充了虚拟数据并作为我的视图模型的公共属性公开:

public class MainViewModel
{
    public MainViewModel()
    {   
        var partners = new Dictionary<string, List<string>>
        {
            {"Company", new List<string> {"company1", "company2"}},
            {"Operator", new List<string> {"false", "true"}},
            {"Interest", new List<string> {"40%", "60%"}},
            {"Type", new List<string> {"type1", "type2"}}
        };
        Asset = new Result("TestType", "TestName", partners);
    }

    public Result Asset { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试将Partners字典绑定到我的数据网格。在Key每个字典条目(例如公司/运营/利息/类型)应该弥补我的DataGrid的头,用各自的值填充列。像这样:

Company | Operator | Interest | Type
company1   false       40%      type1
company2   true        60%      type2
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?我一直在研究这个问题,但数据与我想要的相反。我希望我的键作为数据网格列标题(我不介意对标题进行硬编码,因为我相信标题属性不能使用数据绑定)。到目前为止,这是我的 XAML,itemsource 已正确绑定,但我不知道如何以我需要的格式获取数据:

<DataGrid x:Name="dg" ItemsSource="{Binding Asset.Partners}" AutoGenerateColumns="false">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Company" Binding="{Binding ?}"/>
        <DataGridTextColumn Header="Operator" Binding="{Binding ?}"/>
        <DataGridTextColumn Header="Interest" Binding="{Binding ?}"/>
        <DataGridTextColumn Header="Type" Binding="{Binding ?}"/>
    </DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)

如果我Binding="{Binding Value[0]}用于第一列,那么我会在我的列中得到一“行”值,但我想要反过来。我也试过使用,Binding="{Binding Asset.Partners[Company]}"但没有用。

任何帮助表示赞赏。

Rac*_*hel 3

就我个人而言,我会创建一个对象模型来表示您的数据,并绑定到这些对象的集合。

public class MyObject
{
    public string Company { get; set; }
    public string Operator { get; set; }
    public string Interest { get; set; }
    public string Type { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

public MainViewModel()
{   
    var partners = new ObservableCollection<MyObject>()
    {
        new MyObject("company1", "false", "40%", "type1"),
        new MyObject("company2", "true", "60%", "type2")
    };
    ...
}
Run Code Online (Sandbox Code Playgroud)

我不认为您所要求的内容对于普通的 DataGrid 是不可能的,因为它读取的内容为“对于集合中的每一行,创建一个 DataRow 并将 DataContext 分配给该行”。在您的情况下,每一行代表整个数据网格,因此这对您不起作用。

  • @Will - Rachel 已经向我证实了这一点。你的傲慢言论毫无价值。 (2认同)