Невозможно привести COM-объект к типу класса - PullRequest
0 голосов
/ 26 сентября 2018

Я делаю программное обеспечение для управления библиотекой.Я разделил управление базой данных на отдельную библиотеку 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();
    }
}

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Причина, по которой вы получаете эту проблему, заключается в том, что вы обновляете ViewModel основного представления из ветки нового представления.Когда вы нажали кнопку Add, сработало событие AddBook, это происходит в потоке Нового представления, но вы обновили ViewModel Основного представления в классе YourBooks_View.Вы должны использовать метод CoreDispatcher.RunAsync , чтобы запланировать работу в потоке пользовательского интерфейса для нового представления.

Так что просто измените свой код метода GridView_AddBook с помощью CoreDispatcher.RunAsync метод для планирования работы в потоке пользовательского интерфейса для добавления нового Book объекта.

Вот модифицированный код метода GridView_AddBook:

private async void GridView_AddBook(Book book)
{
    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        ViewModel.Books.Add(book);
    });
}
0 голосов
/ 26 сентября 2018

объект книги, который вы пытаетесь добавить в коллекцию, может быть присоединен к базе данных. При выполнении операции с базой данных убедитесь, что Удалите ее контекст (который зависит от того, какого провайдера БД вы используете).

Чтобы обойти это, вы можете просто скопировать объект книги в новый экземпляр и поместить его в свою коллекцию ViewModel следующим образом:

private void GridView_AddBook(Book book)
{
    Book b = new Book
    {
        Title = book.title,
        Author = book.author,
        Publisher = book.publisher,
        ISBN = book.isbn,
        Quantity = book.quantity.GetValueOrDefault(),
        CoverImageLocation = book.CoverImageUri
    };
    ViewModel.Books.Add(b);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...