2017-11-27 1 views
0

Ich habe eine ObservableCollection von der Viewmodel zu meinem Listview, aber nichts zu binden versucht, in der Listenansicht zeigt sich nicht einmal leere ZellenKann nicht ein Ansichtsmodell ObservableCollection binden an die Listview

Ich möchte die Elemente laden in meiner Datenbank zur Listen

Das Modell:

public class Note 
{ 
    [PrimaryKey] 
    [AutoIncrement] 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string Body { get; set; } 
    public DateTime DateCreated { get; set; } 
} 

The View Modell:

public class MainPageViewModel : INotifyPropertyChanged 
{ 
    public string Boom { get; set; } 
    public ICommand AddNoteIconCommand { get; private set; } 
    private SQLiteAsyncConnection _db; 
    private ObservableCollection<Note> _notes; 
    public ObservableCollection<Note> Notes 
    { 
     get { return _notes; } 
     set 
     { 
      if (_notes == value) 
       return; 

      _notes = value; 
      OnPropertyChanged(); 
     } 
    } 

    private INavigation Navigation; 

    public event PropertyChangedEventHandler PropertyChanged; 

    public MainPageViewModel(INavigation Navigation) 
    { 
     this.Navigation = Navigation; 
     AddNoteIconCommand = new Command(AddNewNote); 
     PrepareDatabase(); 
     Boom = "Hello"; 
    } 

    private async void PrepareDatabase() 
    { 
     _db = DependencyService.Get<ISQLiteDb>().GetConnection(); 
     var _databasenotes = await _db.Table<Note>().ToListAsync(); 
     _notes = new ObservableCollection<Note>(_databasenotes); 
    } 

    private async void AddNewNote() 
    { 
     await Navigation.PushAsync(new NewNotePage()); 
    } 

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

} 

HauptSeite XAML:

<?xml version="1.0" encoding="utf-8" ?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
     xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
     xmlns:local="clr-namespace:NoteTaker" 
     x:Class="NoteTaker.MainPage" 
     Padding="10"> 
<ContentPage.ToolbarItems> 
    <ToolbarItem Icon="Plus.png" Command="{Binding AddNoteIconCommand}" /> 
</ContentPage.ToolbarItems> 

<StackLayout> 
    <ListView HasUnevenRows="True" 
       ItemsSource="{Binding Notes, Mode=TwoWay}"> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <TextCell Text="{Binding Title}" Detail="{Binding Body}" /> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 
<Entry Text = "{Binding Boom}" /> 
</StackLayout> 

Mainpage-Code Behind:

public partial class MainPage : ContentPage 
{ 
    public MainPage() 
    { 
     BindingContext = new MainPageViewModel(Navigation); 
     InitializeComponent();    
    } 
} 

Wo liegt das Problem? Hinweis: Ich habe durch Debugging sichergestellt, dass meine beobachtbare Sammlung mit den Datenbankobjekten gefüllt wird

+0

Versuchen Aufruf InitializeComponent erste – MickyD

+0

Ich habe versucht, nicht funktioniert, obwohl –

+0

versuchen, die VM zu schaffen, bevor Sie es mit dem Binding zuweisen – Jason

Antwort

0

Endlich habe ich geschafft, den Fehler zu beheben, das Problem war mit der Zeile "new ObservableCollection" und ich reparierte das, indem Sie die Elemente manuell durch eine foreach-Schleife zur beobachtbaren Sammlung hinzufügen. Und das löste das Problem und arbeitete wie ein Zauber!

public class MainPageViewModel : INotifyPropertyChanged 
{ 
    public ICommand AddNoteIconCommand { get; private set; } 
    private SQLiteAsyncConnection _db; 
    private ObservableCollection<Note> _notes = new ObservableCollection<Note>(); 
    public ObservableCollection<Note> Notes    
    { 
     get { return _notes; } 
     set 
     { 
      if (_notes == value) 
       return; 

      _notes = value; 
      OnPropertyChanged(); 
     } 
    } 


    private INavigation Navigation; 

    public event PropertyChangedEventHandler PropertyChanged; 

    public MainPageViewModel(INavigation Navigation) 
    { 
     this.Navigation = Navigation; 
     AddNoteIconCommand = new Command(AddNewNote); 
     PrepareDatabase(); 

    } 

    private async void PrepareDatabase() 
    { 
     _db = DependencyService.Get<ISQLiteDb>().GetConnection(); 
     var _databasenotes = await _db.Table<Note>().ToListAsync(); 
     FillObservable(_databasenotes); 
    } 

    private async void AddNewNote() 
    { 
     await Navigation.PushAsync(new NewNotePage()); 
    } 

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

    private void FillObservable(List<Note> _dbnotes) 
    { 
     foreach (var note in _dbnotes) 
     { 
      _notes.Add(note); 
     } 
    } 
} 
0

Sie müssen die Ansicht, dass MainPageViewModel.Notes geändert wird, benachrichtigen.

Ihr Code Notes = new ObservableCollection<Note>(_notes); hat keine Benachrichtigung an die Ansicht gesendet, daher wurde die Ansicht nicht aktualisiert. Sie können MainPageViewModel eine BindableObject machen und OnPropertyChanged anrufen, um die Ansicht zu benachrichtigen, dass neue Notizen vorhanden sind.

Als eine Randnotiz sollten Sie Datenbankverbindung im Modell anstelle von Ansichtsmodell verwalten MVVM-Muster folgen.

+0

Ich habe meinen ViewModel-Code bearbeitet und das OnPropertyChanged implementiert, funktioniert aber immer noch nicht und die Liste zeigt –

+0

@Omar Es scheint, dass 'OnPropertyChanged()' nicht mit dem richtigen 'propertyName' aufgerufen wurde, es sollte' "Notes" sein 'anstelle von' null'. Oder Sie können das '[System.Runtime.CompilerServices.CallerMemberName]' Attribut verwenden, um den Namen automatisch zu erhalten. –

+0

Ich habe versucht, Notes einzugeben, und danach habe ich das CallerMemberName-Attribut hinzugefügt, aber die Liste ist immer noch leer –

Verwandte Themen