Listview 按搜索栏筛选的Xamarin组列表视图

Listview 按搜索栏筛选的Xamarin组列表视图,listview,xamarin,search,mvvm,Listview,Xamarin,Search,Mvvm,我有一个xamarin列表视图和一个搜索栏。它根据您键入的内容显示所有内容或过滤器。如何将listview分组到一口井中?我想按州对它们进行分组。成员们正在从一个web服务中撤出,我有一个州列表。提前谢谢 ListView Xaml <ListView x:Name="ListViewMember" ItemsSource="{Binding PublicMembersList}"

我有一个xamarin列表视图和一个搜索栏。它根据您键入的内容显示所有内容或过滤器。如何将listview分组到一口井中?我想按州对它们进行分组。成员们正在从一个web服务中撤出,我有一个州列表。提前谢谢

ListView Xaml

                <ListView x:Name="ListViewMember"
                      ItemsSource="{Binding PublicMembersList}"
                      VerticalOptions="FillAndExpand"
                      HorizontalOptions="FillAndExpand"
                      HasUnevenRows="true"
                      RefreshCommand="{Binding LoadMembersCommand}"
                      IsPullToRefreshEnabled="True"
                      IsRefreshing="{Binding IsBusy, Mode=TwoWay}"
                      CachingStrategy="RecycleElement"
                      ItemSelected="OnMemberSelected"
                      SizeChanged="OnPageSizeChanged"
                      SeparatorVisibility="Default"
                      SeparatorColor="#000000">
                <ListView.Header>
                    <StackLayout>
                        <Label Text="{Binding PublicMembersList.Count, StringFormat='Active Members = {0}'}"></Label>
                    </StackLayout>
                </ListView.Header>
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <ContentView>
                                <Frame>
                                    <StackLayout x:Name="GridMemberList" Orientation="Horizontal">
                                        <BoxView Color="PaleGreen" HeightRequest="25"></BoxView>
                                        <Label Text="{Binding pMember}"></Label>
                                        <Label Text="{Binding Name}"></Label>
                                    </StackLayout>
                                </Frame>
                            </ContentView>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
查看处理模型的模型

    public class MemberViewModel : BaseViewModel
{
    public int PublicMemberCount => PublicMembersList.Count;

    public ObservableCollection<MemberModel> FilteredGroupList;

    private ObservableCollection<MemberModel> LocalMembersList;

    public ObservableCollection<MemberModel> PublicMembersList
    {
        get
        {
            return LocalMembersList;
        }

        set
        {
            LocalMembersList = value;
            SetProperty(ref LocalMembersList, value);
        }
    }

    private String LocalMemberString;

    public String PublicMemberString
    {
        get
        {
            return LocalMemberString;
        }
        set
        {
            SetProperty(ref LocalMemberString, value);
        }
    }

    public Command LoadMembersCommand { get; set; }

    public Command SearchMembersCommand
    {
        get
        {
            return new Command(() => ExecuteSearchMembersCommand());
        }
    }

    public MemberViewModel()
    {

        Title = "Member Lookup";

        PublicMembersList = new ObservableCollection<MemberModel>();

        LoadMembersCommand = new Command(async () => await ExecuteLoadMembersCommand());

        if (PublicMembersList.Count == 0)
        {
            LoadMembersCommand.Execute(null);
        }

    }

    async Task ExecuteLoadMembersCommand()
    {
        if (IsBusy)
            return;

        IsBusy = true;

        try
        {


            PublicMembersList.Clear();

            var m = await DataSource.GetMembersAsync(true); 

            var d = Services.DataList.GetStates();

            var l = new ObservableCollection<StateModel>(d); 



            foreach (var i in m)
            {

                PublicMembersList.Add(i);
            }

            FilteredGroupList = new ObservableCollection<MemberModel>();

        }
        catch (Exception e)
        {
            Debug.WriteLine("Something - " + e);
        }
        finally
        {
            IsBusy = false;
        }

    }

    private void ExecuteSearchMembersCommand()
    {


        PublicMembersList.GroupBy(c => c.PhysicalState);

        if (string.IsNullOrWhiteSpace(PublicMemberString))
        {

            FilteredGroupList = new ObservableCollection<MemberModel>();

        }
        else
        {

            IEnumerable<MemberModel> f = PublicMembersList.Where(p => p.Name.Contains(PublicMemberString));

            FilteredGroupList = new ObservableCollection<MemberModel>(f);
        }

    }

}
公共类MemberViewModel:BaseViewModel
{
public int PublicMemberCount=>PublicMembersList.Count;
公共可观察集合FilteredGroupList;
私有ObservableCollection LocalMembersList;
公共可观测集合公共成员列表
{
得到
{
返回LocalMembersList;
}
设置
{
LocalMembersList=值;
SetProperty(参考LocalMembersList,值);
}
}
私有字符串LocalMemberString;
公共字符串PublicMemberString
{
得到
{
返回LocalMemberString;
}
设置
{
SetProperty(参考LocalMemberString,值);
}
}
公共命令LoadMembersCommand{get;set;}
公共命令SearchMembersCommand
{
得到
{
返回新命令(()=>ExecuteSearchMembersCommand());
}
}
公共成员视图模型()
{
Title=“成员查找”;
PublicMembersList=新的ObservableCollection();
LoadMembersCommand=new命令(async()=>await ExecuteLoadMembersCommand());
如果(PublicMembersList.Count==0)
{
LoadMembersCommand.Execute(空);
}
}
异步任务ExecuteLoadMembersCommand()
{
如果(忙)
返回;
IsBusy=true;
尝试
{
PublicMembersList.Clear();
var m=await DataSource.GetMembersAsync(true);
var d=Services.DataList.GetStates();
var l=新的可观测集合(d);
foreach(var i以m为单位)
{
公共成员列表。添加(i);
}
FilteredGroupList=新的ObservableCollection();
}
捕获(例外e)
{
Debug.WriteLine(“某物-”+e);
}
最后
{
IsBusy=false;
}
}
私有void ExecuteSearchMembersCommand()
{
PublicMembersList.GroupBy(c=>c.PhysicalState);
if(string.IsNullOrWhiteSpace(PublicMemberString))
{
FilteredGroupList=新的ObservableCollection();
}
其他的
{
IEnumerable f=PublicMembersList.Where(p=>p.Name.Contains(PublicMemberString));
FilteredGroupList=新的ObservableCollection(f);
}
}
}

创建一个继承IEnumerable的组类。它只需要一个属性,即您想要的组名

public class MemberModelGroup : ObservableCollection<MemberModel>
{
    public string Display{get;set;}
}
最后一步是启用分组并指定要使用的绑定


列表视图分组包含在正式文档中。你读过吗?当然这就是我在这里问的原因。我从我的web服务中获取数据,然后动态填充模型,而不是像您证明的链接那样手动填充列表。不知道怎么做。那么我该怎么处理下面的内容呢?为了避免出错,我不得不把它注释掉。IEnumerable f=PublicMembersList.Where(p=>p.Name.Contains(PublicMemberString));FilteredGroupList=新的ObservableCollection(f);FilteredGroupList的对象类型为ObservableCollection?您需要将f的每个元素放置在适当的MemberModelGroup中。然后将FilteredGroupList过滤到和ObservableCollection。我会编辑我的答案来纠正这个好吧,我已经编辑了我的答案来纠正这个。它不必是ObservaleCollection类型,但我通常使用它,这样它就可以通过更改来更新自身。要点是,您需要一个组列表,并将其提供给ListView。啊,我明白了。有道理。它现在工作得很好。非常感谢。
public class MemberModelGroup : ObservableCollection<MemberModel>
{
    public string Display{get;set;}
}
var listOfMemberModels = FromServer.GetMemberModels();
foreach(var memberModel in listOfMemberModels)
{
    var group = UnfilteredList.FirstOrDefault(el => el.Display == memberModel.StateName);
    if(group == null)
    {
        var newGroup = new MemberModelGroup{ Display = memberModel.StateName };
        newGroup.Add(memberModel);
        UnfilteredList.Add(newGroup);
    }
    else
    {
        group.Add(memberModel);
    }
}