动态更改ItemsControl分组

时间:2014-07-09 14:59:12

标签: wpf grouping itemscontrol

我通过互联网搜索动态更改ItemsControl,但没有运气(也许我的查询不够好),所以我在这里问。任何人都可以帮我创建可以动态更改组类型的ItemsControl的分组功能。 例如,我有一系列具有属性的歌曲:Name,Artirst,Singer,Album。然后我有3个单选按钮,其属性用于分组歌曲。 我已经考虑过创建多个CollectionView,但我认为还有另外一种方法更好。 (我是WPF的新人,所以请你再详细说一下答案。谢谢你:))

1 个答案:

答案 0 :(得分:0)

这是我可以用MVVM风格提出的最小示例。

视图模型:

enum GroupBy
{
    Name,
    Artist
}

class Song
{
    public string Name { get; set; }
    public string Artist { get; set; }
}

class SonglistViewModel : ViewModelBase
{
     private GroupBy groupBy;

     public GroupBy GroupBy
     {
          get => this.groupBy;
          set 
          {
               if(this.groupBy == value)
               {
                    return;
               }

               this.groupBy = value;
               this.UpdateGrouping(value);
               this.OnPropertyChanged(); 
          }
     }

     public ObservableCollection<Song> Songs { get; } = new ObservableCollection<Song>();

     private void UpdateGrouping(GroupBy value)
     {
        var servicesView = CollectionViewSource.GetDefaultView(this.Services);
        servicesView.GroupDescriptions.Clear();
        switch (value)
        {
            case GroupBy.Name:
                servicesView.GroupDescriptions.Add(
                    new PropertyGroupDescription(nameof(Song.Name)));
                break;

            case GroupBy.Artist:
                servicesView.GroupDescriptions.Add(
                    new PropertyGroupDescription(nameof(Song.Artist)));
                break;
        }
    }         
}

视图:

<ListView ItemsSource="{Binding Songs}">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" />
            <GridViewColumn Header="Artist" DisplayMemberBinding="{Binding Artist}" />
        </GridView>
    </ListView.View>
    <ListView.GroupStyle>
         <GroupStyle>
             <GroupStyle.HeaderTemplate>
                  <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Name}" />
                        <TextBlock Text="{Binding ItemCount, StringFormat={}({0})}" />
                    </StackPanel>
                </DataTemplate>
            </GroupStyle.HeaderTemplate>
        </GroupStyle>
    </ListViewGroupStyle>
</ListView>