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