将上下文绑定到ListView不起作用

时间:2018-02-22 09:45:31

标签: c# xamarin mvvm xamarin.forms

我似乎无法通过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,但我似乎被困在这里。该模型具有属性代码和名称。很多帮助将不胜感激。谢谢!

3 个答案:

答案 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教程:

From Data Bindings to MVVM

MVVM & Data Binding with Xamarin.Forms

Learn MVVM

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,这就是集合未在您的视图中显示的原因。