XAML .NET MAUI中的分组集合视图

7cwmlq89  于 2023-03-10  发布在  .NET
关注(0)|答案(3)|浏览(192)

我的ViewModel中有一个ObservableRangeCollection Person,它通过ItemsSource在XAML中绑定到一个CollectionView。DataTemplate是Person类型,因此可以显示它们。
目前,我不知道如何进行通过CollectionView中的IsGrouped-Option提供的分组。
我如何根据人名的第一个字母来介绍不同的组,这样我就有了一个组A”,其中所有人的名字都以字母A”开头。
我的ObservableRangeCollection是从SQLite数据库的值填充的,该数据库没有组,只有Person的详细信息。

vwkv1x7d

vwkv1x7d1#

如果要根据人员的名称first character对人员**分组,可以参考下面的示例代码:

样品代码:
XAML格式:

<CollectionView ItemsSource="{Binding Persons}" IsGrouped="True"> 

        <CollectionView.GroupHeaderTemplate>

            <DataTemplate>

                <Label FontSize="18" FontAttributes="Bold" BackgroundColor="Gray" Text="{Binding Name}" />

            </DataTemplate>

        </CollectionView.GroupHeaderTemplate>

        <CollectionView.ItemTemplate>

            <DataTemplate>

                <VerticalStackLayout>

                    <Label

                       Text="{Binding Name}"

                       FontAttributes="Bold" />

                
                </VerticalStackLayout>

            </DataTemplate>

        </CollectionView.ItemTemplate>

    </CollectionView>

视频模型:

public class MainPageViewModel 
    {

        public List<Person> origin_list { get; set; } = new List<Person>();

        public List<Grouped_list> Persons { get; set; } = new List<Grouped_list>();


        public MainPageViewModel()
        {

           //Pseudo data, you may retrieve the data from database and assign to it
            origin_list.AddRange(new List<Person> {

               new Person("Allan", "Male"),
                new Person("Alex", "Male"),
                new Person("Klay", "Male"),
                new Person("Kate", "Female"),
                new Person("Bob", "Male"),
                new Person("Besley", "Male"),
                new Person("John", "Male"),
                new Person("Fiona", "Female")

            });

            //Group by the first letter
             var dict = (origin_list.OrderBy(x=>x.Name)).GroupBy(o => o.Name.Substring(0,1)).ToDictionary(g => g.Key, g => g.ToList());

            foreach(KeyValuePair<string, List<Person>> item in dict)
            {

                Persons.Add(new Grouped_list(item.Key, new List<Person>(item.Value)));
            }

        }

       
    }

分组列表.cs

public class Grouped_list : List<Person> 
    {

        public string Name { get; set; }

        public Grouped_list(string name, List<Person> person):base(person)
        { 
            Name = name;
        
        }
    }

型号:

public class Person 
    {

        public string Name { get; set; }

        public string Gender { get; set; }  

        public Person(string name, string gender)
        {
            
            Name = name;
            Gender = gender;
        
        }

    }

输出:

pxyaymoc

pxyaymoc2#

希望这对你有所帮助。下载ListView示例=〉分组:Github

rta7y2nd

rta7y2nd3#

我的ObservableRangeCollection是从SQLite数据库的值填充的,该数据库没有组,只有Person的详细信息。
你说得好像这是一件必须保持下去的事情。显然,如果你不想分组,你就不能使用分组。所以,如果你打算保持这种方式,我认为这个问题已经回答了。
如果您最终决定创建组,您应该做的第一件事就是绑定到列表的列表。
外层列表比较简单,内层列表有属性,用于分组,扩展列表。
要创建它们,您可以修改从数据库读取它们的方式,但如果您不想或不知道如何这样做,并且希望保持当前阅读,则有一种使用LINQ的方法,以类似的方式进行另一个分组查询:

foreach( IGrouping<string, Model> group in NonGroupedList.GroupBy(s => s.Letter))
    MyGroups.Add(new MyGroup(group.key, group.ToList()));

相关问题