Xamarin Group ListView按搜索栏筛选



我有一个使用搜索栏的xamarin列表视图。它显示所有内容或根据您键入的内容进行筛选。如何将列表视图分组为一个井?我想把它们按州分组。成员们正在从一个网络服务中撤出,我有一份国家名单。提前谢谢。

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>

列表查看后面的代码

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

创建一个继承IEnumerable的组类。它只需要一个属性,这就是你想要的组名。

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

将所有列表更改为使用IEnumerable<MemberModelGroup>。然后,当您从服务器获得MemberModels的列表时,您需要将它们放入正确的MemberModelGroup中。每个组都是类型为IEnumerable<MemberModelGroup>的UnfilteredList中的一个元素,因此您有一个可以使用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}">

最新更新