为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
噜噜哒 2023-08-20 14:53:37
我正在尝试在 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;我想我需要添加这些行,以便我可以操作正在显示的列表。为什么不显示列表?难道这不是应该做的吗?
查看完整描述

3 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

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

查看完整回答
反对 回复 2023-08-20
?
Qyouu

TA贡献1786条经验 获得超11个赞

所以,回答你所有的问题......


首先,绑定。

一旦你设置了,这意味着任何时候你通过调用来ItemsSource="{Binding ContactsList}"表明你已经改变了,这将反映在属性上(所以,更新 UI - 这就是我们将 放入setter 的原因)。因此,您无需每次更改时都手动设置。(特别是来自视图,因为视图不应该知道 ContactsList 在 ViewModel 中是如何定义的。)ContactsListOnPropertyChanged()ItemsSourceOnPropertyChanged()ItemsSource

因此,您可以从视图的代码隐藏中完全删除这些行。


接下来,排序和搜索。

它的作用OnPropertyChanged()是从 ViewModel 重新请求绑定属性,并根据该属性更新 View。因此,在调用之后, View 就会调用OnPropertyChanged()绑定属性 ( ) 的 getter 。ContactsList

因此,一个好主意是将排序机制放入公共属性的 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();

        }

    }

    //...

}

因此,每当调用您的公共财产时,它都会对私有财产进行排序并以这种方式返回集合。


查看完整回答
反对 回复 2023-08-20
?
墨色风雨

TA贡献1853条经验 获得超6个赞

更改public List<MainContacts> ContactsListpublic ObservableCollection<MainContacts> ContactsList

xaml.cs中

而不是LocalList = LocalAPIViewModel.ContactsList;, 把

ContactsList = new ObservableCollection(LocalAPIViewModel.ContactsList);

我认为这会起作用,而不是将 ListView 的 Itemsource 设置为“LocalList”


查看完整回答
反对 回复 2023-08-20
  • 3 回答
  • 0 关注
  • 127 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信