我已经开始学习MVVM,虽然我一般都理解这个理论,但我很难理解如何绑定文本框,以便将它们的值作为sqlcommand的参数值传递。我的代码:
BookModel类
public class BookModel : INotifyPropertyChanged
{
private string bookTitle;
public string BookTitle
{
get { return bookTitle; }
set { bookTitle = value; OnPropertyChanged(BookTitle); }
}
private string bookAuthor;
public string BookAuthor
{
get { return bookAuthor; }
set { bookAuthor = value; OnPropertyChanged(BookAuthor); }
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
我的viewmodel中的方法我将传递给我的命令类:ICommand。谢天谢地,命令运行,所以没关系。
public void AddBook()
{
BookModel bk = new BookModel();
SampleSQL exsql = new SampleSQL();
exsql.NewBooks(bk.BookTitle, bk.BookAuthor);
}
包含我正在运行的SqlCommand的samplesql类
public void NewBooks(string bookTitle, string bookAuthor)
{
this.BookTitle = bookTitle;
this.BookAuthor = bookAuthor;
string query = "Insert Into BookModel (BookTitle, BookAuthor) Values (@BookTitle, @BookAuthor)";
SqlConnection ConStr = new SqlConnection(connection);
SqlCommand command = new SqlCommand(query, ConStr);
command.Parameters.AddWithValue("@BookTitle", BookTitle);
command.Parameters.AddWithValue("@BookAuthor", BookAuthor);
using (ConStr)
{
ConStr.Open();
try
{
command.ExecuteNonQuery();
}
catch (SqlException exception)
{
throw exception;
}
}
}
具有datacontext和资源集的相关XAML
<Window.DataContext>
<local:MainWindowViewModel/>
</Window.DataContext>
<Window.Resources>
<local:BookModel x:Key="bm"/>
</Window.Resources>
<Label Grid.Column="0" Grid.Row="0" Content="Book Title" Style="{StaticResource ItemHeading}"/>
<TextBox Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="0" Text="{Binding Path=BookTitle, Source={StaticResource bm}}" Style="{StaticResource LongTB}"/>
<Label Grid.Column="0" Grid.Row="1" Content="Book Author" Style="{StaticResource ItemHeading}"/>
<TextBox Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="1" Text="{Binding Path=BookAuthor, Source={StaticResource bm}}" Style="{StaticResource LongTB}"/>
我的理解是,由于文本框被绑定,他们应该将它们的值神奇地传递给viewmodel。但是,很明显我错过了一些东西,因为我一直在运行一个sqlexception,告诉我查询中没有提供相应的参数(我假设它意味着它没有被传递,因为没有值)。 / p>
我猜测问题在于ViewModel中的AddBook()方法与视图之间的连接,但是我可能会尝试解决这个问题。
任何帮助将不胜感激!
答案 0 :(得分:0)
缺陷在您的AddBook方法中。
public void AddBook()
{
// You are creating new instance of BookModel here which is not bound to UI.
BookModel bk = new BookModel();
SampleSQL exsql = new SampleSQL();
exsql.NewBooks(bk.BookTitle, bk.BookAuthor);
}
您应该执行以下操作之一。