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