Xamarin组ListView被SearchBar过滤

问题描述 投票:0回答:1

我有一个使用搜索栏的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>

后面的ListView代码

        private void OnSearchChanged(object s, TextChangedEventArgs e)
    {

        ListViewMember.BeginRefresh();

        ViewModel.SearchMembersCommand.Execute(null);

        ListViewMember.ItemsSource = ViewModel.FilteredGroupList;

        ListViewMember.EndRefresh();

    }

查看与模型有关的模型

    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);
        }

    }

}
listview xamarin search mvvm
1个回答
0
投票

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

public class MemberModelGroup : ObservableCollection<MemberModel>
{
    public string Display{get;set;}
}

更改所有列表以使用IEnumerable<MemberModelGroup>。然后,当您从服务器获取MemberModels列表时,需要将其放入正确的MemberModelGroup中。每个组都是UnfilteredList中类型为IEnumerable<MemberModelGroup>的元素,因此您具有可以使用MemberModelGroup.Display进行过滤的组的列表。

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);
    }
}

最后一步是启用分组并指定要使用的绑定。

<ListView IsGroupingEnabled="True" GroupDisplayBinding="{Binding Display}">

© www.soinside.com 2019 - 2024. All rights reserved.