【问题标题】:WPF listbox groupping by substringsWPF列表框按子字符串分组
【发布时间】:2013-03-20 06:33:37
【问题描述】:
我的对象具有存储更多由分隔符分隔的字符串的属性。
我想在启用分组的 WPF 列表框中显示此类对象的列表。我需要的是根据子字符串进行分组。
Object1: 属性 = "string1;string2;string3"
Object2: 属性 = "string2;string3"
我希望列表框可以这样显示:
字符串1
对象 1
对象 2
字符串2
对象 1
字符串3
对象 1
对象 2
这可能吗?
感谢您的帮助。
【问题讨论】:
标签:
wpf
listbox
wpf-controls
wpf-4.0
【解决方案1】:
创建一个包装类。
class MyGroup
{
public string GroupID;
public object SomeObject;
}
构建该包装类的平面列表。
private List<MyGroup> BuildItemsSourceTogether()
{
List<MyGroup>itemsSource = new List<MyGroup>();
foreach(var obj in myListWithObjectsWhichPropertiesAreStringsWhichFuthermoreContainSubstrings)
{
var stringArray = obj.Property123.Split(';');
foreach(var str in stringArray)
{
itemsSource.Add(new MyGroup () { GroupID = str, SomeObject = obj});
}
}
return itemsSource;
}
告诉你包装类中的哪些属性应该用于分组。
class Window1
{
public Window1()
{
InitalizeComponents();
var finalData = new ListCollectionView(BuildItemsSourceTogether());
finalData.GroupDescriptions.Add(new PropertyGroupDescription("GroupID"));
this.DataContext = finalData;
}
}
在 XAML 中设置您的组的外观,并让 WPF 为您分组该扁平的 ID 列表。
我使用了带有列的 DataGrid。您可以使用 ListBox。
<DataGrid ItemsSource="{Binding}">
<DataGrid.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Path=Name}" />
</StackPanel>
</DataTemplate>
</GroupStyle.HeaderTemplate>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander>
<Expander.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Name}" />
<TextBlock Text="{Binding Path=ItemCount}"/>
<TextBlock Text="Items"/>
</StackPanel>
</Expander.Header>
<ItemsPresenter />
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</DataGrid.GroupStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="header1" Binding="{Binding SomeObject.Property321}" />
<DataGridTextColumn Header="header2" Binding="{Binding SomeObject.Property678}" />
</DataGrid.Columns>
</DataGrid>
玩得开心。