Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#将文本框绑定为MVVM中的参数_C#_Wpf_Xaml_Mvvm - Fatal编程技术网

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

C#将文本框绑定为MVVM中的参数,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我已经开始学习MVVM,虽然我基本上理解这个理论,但我很难理解如何绑定文本框,以便它们将其值作为sqlcommand的参数值传递。我的代码: 图书模型类 public class BookModel : INotifyPropertyChanged { private string bookTitle; public string BookTitle { get { return bookTitle; } set { bookTitle =

我已经开始学习MVVM,虽然我基本上理解这个理论,但我很难理解如何绑定文本框,以便它们将其值作为sqlcommand的参数值传递。我的代码:

图书模型类

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中传递到commandclass中的方法: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时,我遗漏了一些东西,它告诉我没有提供查询中相应的参数(我假设这意味着没有传递它,因为没有值)

我想问题在于ViewModel中的AddBook()方法和视图之间的连接,但是我尽可能尝试,似乎无法破解这个问题


任何帮助都将不胜感激

缺陷在于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);
}
您应该执行以下操作之一

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