Привязка данных для просмотра списка в xamarin - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь заполнить просмотр списка таблицей базы данных в приложении форм xamarin. Я получаю исключение нулевого указателя

Ниже приведен 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 голосов
/ 15 октября 2019

Если вы хотите, чтобы ListView автоматически обновлялось по мере добавления, удаления и изменения элементов в базовом списке, вам нужно будет использовать ObservableCollection. ObservableCollection определено в System.Collections.ObjectModel и аналогично списку, за исключением того, что оно может уведомлять 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;
        }
    }
}

Не стесняйтесь спрашивать менялюбой вопрос, если вы все еще не можете решить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...