如何在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.
中处理事件
这是我的项目树:
该项目是一个简单的图书管理器。它与 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.