WPF绑定字典<string,list <person =“”>&gt;按组列出视图

时间:2017-01-21 21:47:17

标签: c# wpf listview dictionary

我有一个班级

class Person
{
  public string Name..get...
  public string Age...get... 
}

这存储在Dictionary<string, List<Person>> m_PersionDict;

我想按列表在列表视图中显示这个字典...组名是字典的关键..

类似的东西:

enter image description here

这里男性和女性是字典中的不同键。

...谢谢

1 个答案:

答案 0 :(得分:3)

没有简单的方法可以做到这一点,即直接绑定到Dictionary<string, List<Person>>并将PropertyGroupDescripton应用于ICollectionView,但您可以轻松地将字典转换为匿名列表对象然后像往常一样按Key属性分组:

public MainWindow()
{
    InitializeComponent();

    //the dictionary
    Dictionary<string, List<Person>> m_PersionDict = new Dictionary<string, List<Person>>();
    m_PersionDict.Add("Male", new List<Person>()
            {
                new Person() { Name = "John Doe", Age = 42 },
                new Person() { Name = "Sammy Doe", Age = 13 }
            });
    m_PersionDict.Add("Female", new List<Person>()
            {
                new Person() { Name = "Jane Doe", Age = 39 }
            });

    var flattened = m_PersionDict.SelectMany(x => x.Value.Select(y => new { Key = x.Key, Name = y.Name, Age = y.Age })).ToList();
    lv.ItemsSource = flattened;

    CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(lv.ItemsSource);
    PropertyGroupDescription groupDescription = new PropertyGroupDescription("Key");
    view.GroupDescriptions.Add(groupDescription);
}

这不应该产生任何实际后果,而且支付的代价很小。

<ListView Name="lv">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding Name}" />
            <GridViewColumn Header="Age" Width="50" DisplayMemberBinding="{Binding Age}" />
        </GridView>
    </ListView.View>
    <ListView.GroupStyle>
        <GroupStyle>
            <GroupStyle.HeaderTemplate>
                <DataTemplate>
                    <TextBlock FontWeight="Bold" FontSize="14" Text="{Binding Name}"/>
                </DataTemplate>
            </GroupStyle.HeaderTemplate>
        </GroupStyle>
    </ListView.GroupStyle>
</ListView>