我正在制作一个图书馆管理软件。我将数据库管理分离到一个独立的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);
YourBooks类订阅了事件“Event_AddBook”:
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.InvalidCastException
HResult=0x80004002
Message=无法将 COM 类型为 'System.Collections.Specialized.NotifyCollectionChangedEventHandler' 的 COM 对象转换为非 COM 类型 'System.Collections.Specialized.NotifyCollectionChangedEventHandler'。表示 COM 组件的类型的实例不能强制转换为不表示 COM 组件的类型;但是只要基础的 COM 组件支持 QueryInterface 调用该接口的 IID,它们就可以强制转换为接口。
Source=System.Private.CoreLib
StackTrace: at System.StubHelpers.StubHelpers.GetCOMIPFromRCW_WinRTDelegate(Object objSrc, IntPtr pCPCMD, IntPtr& ppTarget) at System.Collections.Specialized.NotifyCollectionChangedEventHandler.Invoke(Object sender, NotifyCollectionChangedEventArgs e) at System.Collections.ObjectModel.ObservableCollection
1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
at System.Collections.ObjectModel.ObservableCollection
1.InsertItem(Int32 index, T item)
at System.Collections.ObjectModel.Collection`1.Add(T item)
at Bookshelf.YourBooks_View.GridView_AddBook(Book book) in C:\Users\Hemil\source\repos\Bookshelf\Bookshelf\YourBooks_View.xaml.cs:line 54
at DataAccessLibrary.DataAccess.AddBook(Book book) in C:\Users\Hemil\source\repos\Bookshelf\DataAccessLibrary\DataAccess.cs:line 44
at Bookshelf.NewBook_View.d__3.MoveNext() in C:\Users\Hemil\source\repos\Bookshelf\Bookshelf\NewBook_View.xaml.cs:line 137我不知道这意味着什么。是否有方法解决这个问题或以其他方式通知视图。
对于c#,我不是很擅长,请原谅我的任何错误或愚蠢的问题。
编辑:我使用 Microsoft.Data.Sqlite 容器中提供的 Sqlite 数据库。
编辑:我遵循了此教程:https://learn.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();
}
}
Task.Run(() => ViewModel.Books.Add(book));
。它给了我这个错误System.Runtime.InteropServices.COMException HResult=0x8001010E Message=应用程序调用了一个为不同线程编组的接口。(HRESULT 异常: 0x8001010E (RPC_E_WRONG_THREAD))
。 - Hemil