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;