Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF绑定字典<;字符串,列表<;人>&燃气轮机;按组列出视图_C#_Wpf_Listview_Dictionary - Fatal编程技术网

C# WPF绑定字典<;字符串,列表<;人>&燃气轮机;按组列出视图

C# WPF绑定字典<;字符串,列表<;人>&燃气轮机;按组列出视图,c#,wpf,listview,dictionary,C#,Wpf,Listview,Dictionary,我有一节课 class Person { public string Name..get... public string Age...get... } 这存储在字典m_persondict中 我想按组在列表视图中显示此词典。。。组名是字典的键 比如: 这里男性和女性是字典中不同的键 感谢……没有简单的方法可以做到这一点,即直接绑定到字典,并将PropertyGroupDescripton应用到ICollectionView,但您可以轻松地将字典转换为匿名对象列表,然后像往常一样按

我有一节课

class Person
{
  public string Name..get...
  public string Age...get... 
}
这存储在
字典m_persondict中

我想按组在列表视图中显示此词典。。。组名是字典的键

比如:

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


感谢……

没有简单的方法可以做到这一点,即直接绑定到
字典
,并将
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);
}
public主窗口()
{
初始化组件();
//字典
字典m_persondict=新字典();
m_persondict.添加(“男性”,新列表()
{
新人(){Name=“John Doe”,年龄=42},
新人(){Name=“Sammy Doe”,年龄=13}
});
m_persondict.添加(“女性”,新列表()
{
新人(){Name=“Jane Doe”,年龄=39}
});
var flatten=m_persondict.SelectMany(x=>x.Value.Select(y=>new{Key=x.Key,Name=y.Name,Age=y.Age})).ToList();
lv.ItemsSource=扁平化;
CollectionView视图=(CollectionView)CollectionViewSource.GetDefaultView(lv.ItemsSource);
PropertyGroupDescription groupDescription=新的PropertyGroupDescription(“键”);
view.groupDescription.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>

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

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);
}
public主窗口()
{
初始化组件();
//字典
字典m_persondict=新字典();
m_persondict.添加(“男性”,新列表()
{
新人(){Name=“John Doe”,年龄=42},
新人(){Name=“Sammy Doe”,年龄=13}
});
m_persondict.添加(“女性”,新列表()
{
新人(){Name=“Jane Doe”,年龄=39}
});
var flatten=m_persondict.SelectMany(x=>x.Value.Select(y=>new{Key=x.Key,Name=y.Name,Age=y.Age})).ToList();
lv.ItemsSource=扁平化;
CollectionView视图=(CollectionView)CollectionViewSource.GetDefaultView(lv.ItemsSource);
PropertyGroupDescription groupDescription=新的PropertyGroupDescription(“键”);
view.groupDescription.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>


您可能需要一个TreeView您更愿意“展平”您的数据结构并按图所示进行操作。@jstreet这将是我的最后一个选择。。如果有一种方法可以通过数据绑定从字典填充listview。。我认为…@Patrick我如何将列标题添加到树视图?特别是通过xaml…@HariPanicker:另外,通过在
字典中对分组本身进行“硬编码”
,破坏了让
CollectionViewSource
为您进行分组的全部目的。如果以后要更改分组,则无法更改:分组在数据结构中是“烘焙”的。您可能需要一个树视图。您更愿意“展平”数据结构并按图所示进行操作。@jstreet这将是我的最后一个选项。。如果有一种方法可以通过数据绑定从字典填充listview。。我认为…@Patrick我如何将列标题添加到树视图?特别是通过xaml…@HariPanicker:另外,通过在
字典中对分组本身进行“硬编码”
,破坏了让
CollectionViewSource
为您进行分组的全部目的。如果以后您想更改分组,则无法更改:它在您的数据结构中是“烘焙”的。var selectedItem=(dynamic)lv.SelectedItems[0];字符串名称=selectedItem.name;字符串年龄=selectedItem.age;var selectedItem=(动态)lv.SelectedItems[0];字符串名称=selectedItem.name;字符串年龄=selectedItem.age;