【问题标题】: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>
    

    玩得开心。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-15
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      • 1970-01-01
      • 2014-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多