我似乎无法通过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");
}
}
查看(.cs):
public partial class DiscountPage : ContentPage
{
public DiscountPage()
{
InitializeComponent();
BindingContext = new DiscountPageViewModel();
}
}
查看(XAML):
<ContentPage.Content>
<StackLayout>
<StackLayout Margin="12, 5, 12, 0">
<Entry Placeholder="Search..."/>
</StackLayout>
<StackLayout>
<ListView BindingContext="{Binding lister}">
<ListView.ItemTemplate>
<DataTemplate >
<TextCell Text="{Binding name}" Detail="{Binding code}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</StackLayout>
</ContentPage.Content>
API调用正常工作,数据正在其他地方显示。我正在尝试学习MVVM,但我似乎被困在这里。该模型具有属性代码和名称。很多帮助将不胜感激。谢谢!
答案 0 :(得分:3)
要在设置ListView
后更新BindingContext
中的项目,您必须使用ObservableCollection
。
更改此行
public List<DiscountModel> lister = new List<DiscountModel>();
到
public ObservableCollection<DiscountModel> lister = new ObservableCollection<DiscountModel>();
之后不要创建新列表非常重要。
所以不要这样:
//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);
}
原因在于,当您进入数据绑定时,您必须在对象上实现INotifyPropertyChanged
接口。这将向UI发出信号,指示属性值已更改且UI需要更新。在收藏方面,请使用ObservableCollection
的{{1}}。<{1}}。
答案 1 :(得分:2)
您最好首先看一下这些MVVM教程:
MVVM & Data Binding with Xamarin.Forms
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)));
}
}
答案 2 :(得分:1)
这是一个简单的修复。在您的XAML文件中,不是设置ListView的BindingContext属性,而是设置 ItemsSource 属性:
<ListView ItemsSource="{Binding lister}">
这将自动将ListView的绑定上下文设置为ViewModel中的集合。目前ItemsSource属性为null,这就是集合未在您的视图中显示的原因。