WPF MVVM绑定字典<string,list <string =“”>&gt;到datagrid

时间:2016-04-01 15:00:48

标签: c# wpf xaml mvvm datagrid

我无法使用正确的布局将Dictionary<string, List<string>>绑定到我的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; }
}

我填充了虚拟数据并将其作为我的viewmodel的公共属性公开:

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; }
}

我正在尝试将Partners字典绑定到我的数据网格。每个词典条目的Key(例如公司/运营商/兴趣/类型)应构成我的数据网格的标题,相应的值填充列。像这样:

Company | Operator | Interest | Type
company1   false       40%      type1
company2   true        60%      type2

我怎样才能做到这一点?我一直在关注this question,但数据与我想要的方式相反。我希望我的密钥作为datagrid列标题(我不介意硬编码标头,因为我认为标头属性不能使用数据绑定)。到目前为止,这是我的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>

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

任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:3)

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

public class MyObject
{
    public string Company { get; set; }
    public string Operator { get; set; }
    public string Interest { get; set; }
    public string Type { get; set; }
}

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

我不认为你可以使用普通的DataGrid提出要求,因为它读取的内容为&#34;对于集合中的每一行,创建一个DataRow并将DataContext分配给该行&# 34 ;.在您的情况下,每行代表整个数据网格,因此这对您不起作用。

答案 1 :(得分:0)

@courlu字典也可以实现所有功能,但是大多数人都喜欢ObservableCollection。    字典还继承了IEnumerable和ICollection,它们告诉您该字典也能够为wpf控件分配为ItemSource。

.Net提供的字典通用代码: 公共类词典:IDictionary,ICollection>,IEnumerable>,IEnumerable,IDictionary,ICollection,IReadOnlyDictionary,IReadOnlyCollection>,ISerializable,IDeserializationCallback     {      }

所以您需要在代码中进行以下更改

<DataGrid x:Name="dg" ItemsSource="{Binding Asset.Partners.Values}" AutoGenerateColumns="false">
<DataGrid.Columns>
    <DataGridTextColumn Header="Company" Binding="{Binding Company}"/>
    <DataGridTextColumn Header="Operator" Binding="{Binding Operator}"/>
    <DataGridTextColumn Header="Interest" Binding="{Binding Interest}"/>
    <DataGridTextColumn Header="Type" Binding="{Binding Type}"/>
</DataGrid.Columns>

如果您要使用双向模式绑定,则使用此2接口INotifyCollectionChanged,INotifyPropertyChanged继承字典类,它将支持2方式绑定,例如ObservableCollection。