如何在uwp中实现信号槽

How to implement signal slot in uwp

这是我的项目树:

该项目是一个简单的图书管理器。它与 sqlite 数据库交互。

YourBooks class 看起来像这样:

public sealed partial class YourBooks : Page
{
    private ObservableCollection<Book> Books;

    public YourBooks()
    {
        this.InitializeComponent();

        DatabaseManager.InitializeDatabase();
        Books = DatabaseManager.GetBooks();
    }

    private async void Add_a_book_Clicked(object sender, RoutedEventArgs e)
    {
        //This doesn't matter
    }
}

DatabaseManager class 充当应用程序和数据库之间的中间人。这是代码:

class Book
{
    public string Title { get; set; }
    public string Author { get; set; }
    public string ISBN { get; set; }
    public int Quantity { get; set; }
    public string CoverImage { get; set; }
}

class DatabaseManager
{
    public static void InitializeDatabase()
    {
        using (SqliteConnection db = new SqliteConnection("FileName= MyBooks.db"))
        {
            db.Open();

            string command = "create table if not exists MyBooks " +
                             "(title text primary key not null, author text not null, isbn text not null, quantity integer not null, " +
                             "CoverImage text not null)";

            SqliteCommand createTable = new SqliteCommand(command, db);

            SqliteDataReader reader = createTable.ExecuteReader();

            while(reader.Read())
            { }
        }
    }

    public static ObservableCollection<Book> GetBooks()
    {
        using (SqliteConnection db = new SqliteConnection("FileName=MyBooks.db"))
        {
            db.Open();

            string command = "select title, author, quantity, CoverImage from MyBooks";

            SqliteCommand getBooks = new SqliteCommand(command, db);

            SqliteDataReader dataReturned = getBooks.ExecuteReader();

            ObservableCollection<Book> books = new ObservableCollection<Book>();
            while(dataReturned.Read())
            {
                books.Add(new Book
                {
                    Title = dataReturned.GetString(0),
                    Author = dataReturned.GetString(1),
                    Quantity = dataReturned.GetInt32(2),
                    CoverImage = dataReturned.GetString(3)
                });
            }

            return books;
        } 
    }

    public static void AddBook(string title, string author, string isbn, int quantity, string coverImageLocation)
    {
        using (SqliteConnection db = new SqliteConnection("FileName=MyBooks.db"))
        {
            db.Open();

            SqliteCommand command = new SqliteCommand
            {
                CommandText = "insert into MyBooks values (@title, @author, @isbn, @quantity, @coverImage)",
                Connection = db
            };

            command.Parameters.AddWithValue("@title", title);
            command.Parameters.AddWithValue("@author", author);
            command.Parameters.AddWithValue("@isbn", isbn);
            command.Parameters.AddWithValue("@quantity", quantity);
            command.Parameters.AddWithValue("@coverImage", coverImageLocation);

            command.ExecuteReader();
        }
    }
}

在我的新书 class 中,我这样更新数据库:

DatabaseManager.AddBook(BookNameTextBox.Text, AuthorTextBox.Text, ISBNTextBox.Text, Convert.ToInt32(Quantity.Text), destinationFile.Path);

我希望 YourBooks class 收到数据库已更改的通知。在 UWP 之前,我对 Qt 的经验很少。在 Qt 中,它有信号和槽机制。所以你要做的是定义一个你可以触发的信号,然后插槽将被调用。

如何从 NewBook 通知 YourBooks 数据库已更改,以便它可以自行更新。

在您的 Book class(或任何您调用的类型)中实现 INotifyPropertyChanged 接口,并在您设置 [=30= 时引发 PropertyChanged 事件] 到一个新的值。

然后视图中绑定到相应 属性 的任何 UI 元素将自动更新。

如果您向数据库添加一本新书,您还应该向 GridView 绑定的 ObservableCollection<T> 添加一个新的 Book 对象。

在您的情况下,您可以从 DatabaseManager class 引发事件并在 YourBooks class.

中处理事件