如何在 Xamarin 中将 listview itemssource 设置为 viewmodel?

我正在尝试在 xamarin 中创建一个列表视图,显示来自restapi的数据,但可以选择过滤列表或根据姓氏对其进行排序。


我已将绑定上下文设置为等于有效的 apiviewmodel 。但我想将 itemssource 设置为一个可以稍后操作的列表,而不是绑定上下文。


这是有效的代码:


XML:


<ListView x:Name="DirectoryListView" ItemsSource="{Binding ContactsList}" IsPullToRefreshEnabled="True">

Xaml.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;

我想我需要添加这些行,以便我可以操作正在显示的列表。为什么不显示列表?难道这不是应该做的吗?


噜噜哒
浏览 128回答 3
3回答

忽然笑

根据您的描述和代码,您首先使用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是否有数据。

Qyouu

所以,回答你所有的问题......首先,绑定。一旦你设置了,这意味着任何时候你通过调用来ItemsSource="{Binding ContactsList}"表明你已经改变了,这将反映在属性上(所以,更新 UI - 这就是我们将 放入setter 的原因)。因此,您无需每次更改时都手动设置。(特别是来自视图,因为视图不应该知道 ContactsList 在 ViewModel 中是如何定义的。)ContactsListOnPropertyChanged()ItemsSourceOnPropertyChanged()ItemsSource因此,您可以从视图的代码隐藏中完全删除这些行。接下来,排序和搜索。它的作用OnPropertyChanged()是从 ViewModel 重新请求绑定属性,并根据该属性更新 View。因此,在调用之后,&nbsp;View 就会调用OnPropertyChanged()绑定属性 ( ) 的 getter 。ContactsList因此,一个好主意是将排序机制放入公共属性的 getter 中。(或者设置器,当重置属性时。)像这样:public class ViewModel {&nbsp; &nbsp; private ObserveableCollection<MainContacts> contactList { get; set; }&nbsp; &nbsp; public ObserveableCollection<MainContacts> ContactList {&nbsp; &nbsp; &nbsp; &nbsp; get {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return new ObservableCollection<MainContacts>(contactList&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .Where(yourFilteringFunc)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .OrderBy(yourOrderingFunc));&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; set {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; contactsList = value;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OnPropertyChanged();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; //...}因此,每当调用您的公共财产时,它都会对私有财产进行排序并以这种方式返回集合。

墨色风雨

更改public List<MainContacts> ContactsList为public ObservableCollection<MainContacts> ContactsList在xaml.cs中而不是LocalList = LocalAPIViewModel.ContactsList;, 把ContactsList&nbsp;=&nbsp;new&nbsp;ObservableCollection(LocalAPIViewModel.ContactsList);我认为这会起作用,而不是将 ListView 的 Itemsource 设置为“LocalList”
打开App,查看更多内容
随时随地看视频慕课网APP