C#绑定文本框作为MVVM中的参数

时间:2017-11-02 03:00:33

标签: c# wpf xaml mvvm

我已经开始学习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()方法与视​​图之间的连接,但是我可能会尝试解决这个问题。

任何帮助将不胜感激!

1 个答案:

答案 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);
}

您应该执行以下操作之一。

  1. 不要将BookModel用作静态资源,而是将其作为VM中的属性,然后将其绑定到UI。
  2. 在BookModel中使用AddBook方法,以便始终可以对绑定数据调用它。