Я делаю программное обеспечение для управления библиотекой.Я разделил управление базой данных на отдельную библиотеку c # 'DataAccessLibrary'.Он содержит DataAccess.cs:
public static event MyDelegate Event_AddBook;
public static void InitializeDatabase()
{
using (SqliteConnection db = new SqliteConnection("Filename=MyBooks.db"))
{
db.Open();
//Not necessary
}
}
public static void AddBook(Book book)
{
Event_AddBook.Invoke(book);
using (SqliteConnection db = new SqliteConnection("Filename=MyBooks.db"))
{
db.Open();
//Not necessary
}
}
public static ObservableCollection<Book> GetBooks()
{
ObservableCollection<Book> books = new ObservableCollection<Book>();
using (SqliteConnection db = new SqliteConnection("Filename=MyBooks.db"))
{
db.Open();
//Not necessary
}
return books;
}
}
Когда книга добавляется в базу данных, она вызывает событие, так что мой класс YourBooks_View (отображающий книги) получает уведомление о добавлении книги.
( ПРИМЕЧАНИЕ. Книга добавляется в новом окне. )
В другом файле я добавляю книгу в базу данных следующим образом:
Book b = new Book
{
Title = title,
Author = author,
Publisher = publisher,
ISBN = isbn,
Quantity = quantity.GetValueOrDefault(),
CoverImageLocation = CoverImageUri
};
DataAccess.AddBook(b);
Событие Event_AddBook подписано классом YourBooks:
public sealed partial class YourBooks_View : Page
{
private BooksViewModel ViewModel { get; set; } = new BooksViewModel();
public YourBooks_View()
{
this.InitializeComponent();
DataAccess.Event_AddBook += new MyDelegate(this.GridView_AddBook);
}
private void GridView_AddBook(Book book)
{
ViewModel.Books.Add(book);
}
}
Код компилируется без ошибок, но во время выполнения, когда я добавляю книгу, это исключение выдается в строке YourBooks_View.GridView_AddBook ():
System.Экземпляры типов, которые представляют компоненты COM, не могут быть преобразованы в типы, которые не представляют компоненты COM;однако они могут быть преобразованы в интерфейсы, если базовый компонент COM поддерживает вызовы QueryInterface для IID интерфейса.Source = System.Private.CoreLib StackTrace: в System.StubHelpers.StubHelpers.GetCOMIPFromRCW_WinRTDelegate (Объект objSrc, IntPtr pCPCMD, IntPtr & ppTarget) в System.Collections.Sject.Oject.Holject.HeventCventEventCventEventCventEventCventEventCventEventCventEventCventEventCventEventCventEventCventEventCventEventCventEventCventEventCventEventCventEventCventEventCventEventCventEventCventEventCventEventCventEventChint.WeO.ObservableCollection 1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
at System.Collections.ObjectModel.ObservableCollection
1.InsertItem (индекс Int32, элемент T) в System.Collections.ObjectModel.Collection`1.Add (элемент T) в Bookshelf.YourBooks_View.GridView_AddBook (книга) в C: \ Users \ Hemil \ source\ repos \ Bookshelf \ Bookshelf \ YourBooks_View.xaml.cs: строка 54 в DataAccessLibrary.DataAccess.AddBook (книга) в C: \ Users \ Hemil \ source \ repos \ Bookshelf \ DataAccessLibrary \ DataAccess.cs: строка 44 в Книжной полке.NewBook_View.d__3.MoveNext () в C: \ Users \ Hemil \ source \ repos \ Bookshelf \ Bookshelf \ NewBook_View.xaml.cs: строка 137
Я не знаю, что это значит.Есть ли способ решить эту проблему или есть способ уведомить мнение другим способом.
Я не очень хорош в c #.Простите меня за любую ошибку или глупый вопрос.
РЕДАКТИРОВАТЬ: Я использую базу данных Sqlite, как предусмотрено в контейнере Microsoft.Data.Sqlite.
РЕДАКТИРОВАТЬ: Я следовал этому руководству: https://docs.microsoft.com/en-us/windows/uwp/data-access/sqlite-databases. Я нацелился на последнюю версию Windows 10, поэтому я не включил Sqlite в свое приложение
РЕДАКТИРОВАТЬ: Я загрузил весь исходный код в публичный репозиторий на gitlab здесь: https://gitlab.com/rahem027/bookshelf2
РЕДАКТИРОВАТЬ: Я думаю, что я должен был также включить исходный код BookViewModel.Ну, вот оно:
public class BooksViewModel
{
private ObservableCollection<Book> books { get; set; }
public ObservableCollection<Book> Books
{
get { return this.books; }
set
{
this.books = value;
}
}
public BooksViewModel()
{
books = DataAccess.GetBooks();
}
}