C# 将上下文绑定到ListView无效

C# 将上下文绑定到ListView无效,c#,xamarin,mvvm,xamarin.forms,C#,Xamarin,Mvvm,Xamarin.forms,我似乎无法通过BindingContext向我的listview显示数据。列表视图显示为空白。代码如下 视图模型: public class DiscountPageViewModel { //initalize variables here RestService service = new RestService(); public List<DiscountModel> lister = new List<DiscountModel>();

我似乎无法通过BindingContext向我的listview显示数据。列表视图显示为空白。代码如下

视图模型:

public class DiscountPageViewModel
{
    //initalize variables here
    RestService service = new RestService();
    public List<DiscountModel> lister = new List<DiscountModel>();

    public DiscountPageViewModel()
    {
        Get_Data();
    }

    //get data
    async void Get_Data()
    {
        lister = await service.Get_Data<DiscountModel>("discount");

    }

}
视图(XAML):



API调用起作用,数据显示在别处。我试图学习MVVM,但我似乎被困在这里。模型具有属性代码和名称。非常感谢您的帮助。谢谢大家!

要在设置
绑定上下文
后更新
列表视图
中的项目,必须使用
可观察集合

换行

public List<DiscountModel> lister = new List<DiscountModel>();
public List lister=new List();

公共ObservableCollection列表器=新ObservableCollection(); 以后不要创建新列表,这一点很重要

因此,与此相反:

//get data
async void Get_Data()
{
    lister = await service.Get_Data<DiscountModel>("discount");
}
//获取数据
异步void Get_Data()
{
lister=等待服务。获取_数据(“折扣”);
}
实现如下内容:

//get data
async void Get_Data()
{
    var results = await service.Get_Data<DiscountModel>("discount");

    lister.Clear();

    foreach (var item in results)
        lister.Add(item);
}
//获取数据
异步void Get_Data()
{
var结果=等待服务。获取_数据(“折扣”);
lister.Clear();
foreach(结果中的var项目)
添加(项);
}

原因是,当您进入数据绑定时,您必须在对象上实现
INotifyPropertyChanged
接口。这将向UI发出属性值已更改且UI需要更新的信号。关于集合,请使用
ObservableCollection
,它的集合变体为
INotifyPropertyChanged

您最好先看看这些MVVM教程:

公共类折扣页面视图模型:INotifyPropertyChanged
{
私有可观察收集列表器;
公共事件属性更改事件处理程序属性更改;
//在这里初始化变量
RestService=新的RestService();
公共可观测收集列表器
{
获取=>\u列表器;
设置
{
_lister=值;
OnPropertyChanged();
}
}
公共折扣页面视图模型()
{
获取_数据();
}
//获取数据
异步void Get_Data()
{
lister=等待服务。获取_数据(“折扣”);
}
受保护的虚拟void OnPropertyChanged([CallerMemberName]字符串propertyName=null)
{
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs((propertyName));
}
}

这是一个简单的解决方案。在XAML文件中,不要设置ListView的BindingContext属性,而是设置ItemsSource属性:

<ListView ItemsSource="{Binding lister}">

这将自动将ListView的绑定上下文设置为ViewModel中的集合。当前ItemsSource属性为null,这就是为什么集合没有显示在视图中

//get data
async void Get_Data()
{
    lister = await service.Get_Data<DiscountModel>("discount");
}
//get data
async void Get_Data()
{
    var results = await service.Get_Data<DiscountModel>("discount");

    lister.Clear();

    foreach (var item in results)
        lister.Add(item);
}
public class DiscountPageViewModel : INotifyPropertyChanged
{
    private ObservableCollection<DiscountModel> _lister;

    public event PropertyChangedEventHandler PropertyChanged;

    //initalize variables here
    RestService service = new RestService();

    public ObservableCollection<DiscountModel> lister
    {
        get => _lister;
        set
        {
            _lister = value;
            OnPropertyChanged();
        }
    }
    public DiscountPageViewModel()
    {
        Get_Data();
    }

    //get data
    async void Get_Data()
    {
        lister = await service.Get_Data<DiscountModel>("discount");
    }

    protected virtual void OnPropertyChanged([CallerMemberName]string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs((propertyName)));
    }

}
<ListView ItemsSource="{Binding lister}">