8

有时 WPF 对我来说太复杂了。我的“Window1”拥有一组“Group”。“Group”是一个包含“Person”集合的类。最后,这应该是一个联系人列表。我只想在 ListBox 中显示组及其人员,其中列表组的组名称等于我的类“组”的名称属性。

我已经尝试将 CollectionViewSource 绑定到“集合”。组显示正确,但列表中的项目与组名称相同。所以每个组只有一个项目:它的组名。

这里的许多示例显示了只有一个集合的项目分组。我可以做的是将组名设置为“Person”的属性。但是我无法计算(这确实是必要的): - 每组中有多少人 - 其中有多少人具有“状态”“在线”。

我在“组”类中使用 linq 来计算它。感谢您提供任何帮助我入门的建议。

4

2 回答 2

22

好吧,我不确定这是否是您想要实现的目标,但您可以尝试以下方法:

假设你的课程是这样的:

public class Group
{
    public string Name { get; set; }
    public List<Contact> Contacts { get; set; }
}

public class Contact
{
    public string Name { get; set; }
    public bool IsOnline { get; set; }
}

您可以将ListBox.ItemTemplate另一个 ListBox 设置为绑定到 Contacts 属性,例如:

<CollectionViewSource x:Key="groups" Source="{Binding}" >
    <CollectionViewSource.GroupDescriptions>
        <PropertyGroupDescription PropertyName="Name" />
    </CollectionViewSource.GroupDescriptions>
</CollectionViewSource>

<DataTemplate x:Key="groupTemplate" DataType="Group">
    <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding Name}" />
    </StackPanel>
</DataTemplate>

<ListBox ItemsSource="{Binding Source={StaticResource groups}}">
    <ListBox.GroupStyle>
        <GroupStyle HeaderTemplate="{StaticResource groupTemplate}" />
    </ListBox.GroupStyle>
    <ListBox.ItemTemplate>
        <DataTemplate DataType="Contact">
            <ListBox ItemsSource="{Binding Contacts}">
                <ListBox.ItemTemplate>
                    <DataTemplate DataType="Contact">
                        <TextBlock Text="{Binding Name}" />
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

您必须稍微设置内部列表框的样式。

编辑:使用的另一种解决方案TreeView

<DataTemplate DataType="Contact">
   <TextBlock Text="{Binding Name}" />
</DataTemplate>

<TreeView ItemsSource="{Binding Source={StaticResource groups}}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate DataType="Group" ItemsSource="{Binding Contacts}">
            <TextBlock Text="{Binding Name}" />
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>
于 2009-05-22T07:25:41.087 回答
8

如果您有Programming WPF的副本,请跳到第 221 页。如果没有,我会总结一下(以我无能的方式)

首先,您不需要手动对 Person 对象进行分组。

如果每个 Person 对象都有一个 Group 属性,

People people = // retrieve the List<Person> somehow
ICollectionView view = CollectionViewSource.GetDefaultView(people);
view.GroupDescriptions.Add( new PropertyGroupDescription("Group") );

从 ItemsControl 派生的所有控件都可以显示分组项,因此

// the XAML
<ListBox ... ItemsSource={Binding}>
  <ListBox.GroupStyle>
    <x:Static Member="GroupStyle.Default" />
  </ListBox.GroupStyle>
</ListBox>

您还可以定义自定义 GroupStyle 并指定 GroupStyle.HeaderTemplate 来定义一个新的 DataTemplate,该 DataTemplate 显示自定义属性,如“一些 PropertyValue (Count)” - 将一个 TextBlock 绑定到{Binding SomeProperty},另一个绑定到{Binding ItemCount}

高温高压

于 2009-05-22T06:52:23.480 回答