Xamarin中ListView的数据绑定

时间:2019-10-15 04:14:01

标签: xamarin xamarin.forms

我正在尝试使用Xamarin Forms应用程序中的数据库表填充listview 我收到空指针异常

以下是用于列表视图的XAML

<ListView x:Name="_listView"  
          ItemsSource="{Binding itemsInList}" 
          Grid.Column="0" 
          Grid.Row="0" 
          SelectedItem="{Binding SelectedItem}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <StackLayout>
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="*"/>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="1*"/>
                        </Grid.ColumnDefinitions>
                        <Label  Text="{Binding Name}"  Grid.Column="0"   Grid.Row="0" />
                    </Grid>
                </StackLayout>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

下面是xaml.cs(后面的代码)

public List <ServiceProvider> itemlist;
public List <ServiceProvider> itemsInList 
{
   get {return itemlist;}
}
protected override void OnAppearing() 
{
   base.OnAppearing();
   ExpensesDatabase dbcon = new ExpensesDatabase(completePath);
   itemlist = dbcon.GetItems(completePath);
   // _listView.ItemsSource = itemlist;
}

下面是数据库文件

public class ExpensesDatabase 
{
    readonly SQLiteConnection database;
    public ExpensesDatabase(string dbPath) 
    {
        database = new SQLiteConnection(dbPath);
        database.CreateTable < ServiceProvider > ();
    }
    public List < ServiceProvider > GetItems(string dbPath) 
    {
        return database.Table < ServiceProvider > ().ToList();
    }
}

数据未显示在列表视图中

1 个答案:

答案 0 :(得分:0)

如果您希望ListView在基础列表中添加,删除和更改项时自动更新,则需要使用ObservableCollectionObservableCollection是在System.Collections.ObjectModel中定义的,与List一样,只是它可以通知ListView任何更改:

 public ObservableCollection<ServiceProvider> itemsInList { get; set; }

然后确保您设置了正确的bindingContext并初始化了ObservableCollection

public MainPage()
        {
            InitializeComponent();

            itemsInList = new ObservableCollection<ServiceProvider>();

            BindingContext = this;

        }

我编写了一个示例进行测试,它可以正常工作,您可以查看完整的代码:

public partial class MainPage : ContentPage
{
    public ObservableCollection<ServiceProvider> itemsInList { get; set; }


    public MainPage()
    {
        InitializeComponent();

        itemsInList = new ObservableCollection<ServiceProvider>();

        BindingContext = this;

    }
    protected override void OnAppearing()
    {
        base.OnAppearing();

        itemsInList.Add(new ServiceProvider() { Name= "a"});
    }
}

public class ServiceProvider : INotifyPropertyChanged
{
    string name;

    public event PropertyChangedEventHandler PropertyChanged;

    public ServiceProvider()
    {

    }

    public String Name
    {
        set
        {
            if (name != value)
            {
                name = value;

                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("Name"));
                }
            }
        }
        get
        {
            return name;
        }
    }
}

如果您仍然无法解决,请随时问我任何问题。