[英]How to set listview itemssource to a viewmodel in Xamarin?
我正在嘗試在 xamarin 中創建一個列表視圖以顯示來自 restapi 的數據,但可以選擇過濾列表或根據姓氏對其進行排序。
我已將 bindingcontext 設置為等於有效的 apiviewmodel。 但我想將 itemssource 設置為以后可以操作的列表,而不是綁定上下文。
這是有效的代碼:
Xml:
<ListView x:Name="DirectoryListView" ItemsSource="{Binding ContactsList}" IsPullToRefreshEnabled="True">
xml.cs:
LocalAPIViewModel = new APIViewModel();
BindingContext = LocalAPIViewModel;
APIViewModel.cs:
private List<MainContacts> _ContactsList { get; set; }
public List<MainContacts> ContactsList
{
get
{
return _ContactsList;
}
set
{
if(value != _ContactsList)
{
_ContactsList = value;
NotifyPropertyChanged();
}
}
}
public class MainContacts
{
public int ID { get; set; }
public string FirstName { get; set; }
}
這一切正常。 只有當我添加以下幾行時,它才會停止在列表視圖中顯示數據:
xaml.cs:
LocalList = LocalAPIViewModel.ContactsList;
DirectoryListView.ItemsSource = LocalList;
我想我需要添加這些行,以便我可以操作正在顯示的列表。 為什么不顯示列表? 這不是應該怎么做嗎?
根據你的描述和代碼,你先用MVVM綁定ListView,效果很好,現在你想直接用Viewmodel綁定xaml.cs中的ListView itemsource對不對?
如果是,我根據你的代碼做了一個示例,你可以看看,數據可以成功顯示。
public partial class Page4 : ContentPage
{
public APIViewModel LocalAPIViewModel { get; set; }
public Page4 ()
{
InitializeComponent ();
LocalAPIViewModel = new APIViewModel();
listview1.ItemsSource = LocalAPIViewModel.ContactsList;
}
}
public class APIViewModel
{
public ObservableCollection<MainContacts> ContactsList { get; set; }
public APIViewModel()
{
loadddata();
}
public void loadddata()
{
ContactsList = new ObservableCollection<MainContacts>();
for(int i=0;i<20;i++)
{
MainContacts p = new MainContacts();
p.ID = i;
p.FirstName = "cherry"+i;
ContactsList.Add(p);
}
}
}
public class MainContacts
{
public int ID { get; set; }
public string FirstName { get; set; }
}
所以我建議你可以檢查 ContactsList 如果有數據。
更新:
我希望能夠使用搜索欄搜索列表,並按名字或姓氏對其進行排序。 我還希望能夠單擊其中一個聯系人並打開有關該聯系人的單獨頁面
我做了一個可以滿足您要求的樣品,您可以看看:
所以,回答你所有的問題......
第一,綁定。
一旦您設置了ItemsSource="{Binding ContactsList}"
這意味着任何時候您通過調用OnPropertyChanged()
表示您已更改您的ContactsList
,這將反映在ItemsSource
屬性上(因此,更新 UI - 這就是為什么我們將OnPropertyChanged()
放入 setter)。 因此,您無需在每次更改ItemsSource
時手動設置它。 (特別是從視圖中,因為視圖應該不知道如何在 ViewModel 中定義 ContactsList。)
因此,您可以從視圖的代碼隱藏中完全刪除這些行。
接下來是排序和搜索。
OnPropertyChanged()
所做的是從 ViewModel 重新請求綁定屬性,並根據此更新 View。 因此,就在OnPropertyChanged()
被調用之后,綁定屬性 ( ContactsList
) 的 getter 被視圖調用。
因此,一個好主意是將排序機制放入公共屬性的 getter 中。 (或設置器,重置屬性時。)是這樣的:
public class ViewModel {
private ObserveableCollection<MainContacts> contactList { get; set; }
public ObserveableCollection<MainContacts> ContactList {
get {
return new ObservableCollection<MainContacts>(contactList
.Where(yourFilteringFunc)
.OrderBy(yourOrderingFunc));
}
set {
contactsList = value;
OnPropertyChanged();
}
}
//...
}
因此,無論何時調用您的公共屬性,它都會對私有屬性進行排序並以這種方式返回集合。
將public List<MainContacts> ContactsList
更改為public ObservableCollection<MainContacts> ContactsList
在xaml.cs 中
而不是LocalList = LocalAPIViewModel.ContactsList;
, 放
ContactsList = new ObservableCollection(LocalAPIViewModel.ContactsList);
我認為這會起作用,而不是將 ListView 的 Itemsource 設置為“LocalList”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.