簡體   English   中英

如何在 Xamarin 中將列表視圖項源設置為視圖模型?

[英]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 如果有數據。

更新:

我希望能夠使用搜索欄搜索列表,並按名字或姓氏對其進行排序。 我還希望能夠單擊其中一個聯系人並打開有關該聯系人的單獨頁面

我做了一個可以滿足您要求的樣品,您可以看看:

https://github.com/851265601/xf-listview

在此處輸入圖片說明

在此處輸入圖片說明

所以,回答你所有的問題......


第一,綁定。

一旦您設置了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM