简体   繁体   中英

Could not create an instance of type ViewModel

I'm new to MVVM and WPF.

I have created a simple addition application which gets two number as input and add the given number in database and provide the result in textbox.

The application works fine.

But the windows.xaml throws the following error

Could not create an instance of type ViewModel

Windows.xaml

<Window x:Class="addition.Window1"
         xmlns:vm="clr-namespace:addition.ViewModel" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Window.DataContext>
        <vm:ViewModel/>
    </Window.DataContext>
    <Grid>

        <Label Height="28" Margin="28,54,0,0" Name="Number1" VerticalAlignment="Top" HorizontalAlignment="Left" Width="48">Number</Label>
        <TextBox Height="28" Margin="112,56,46,0"  Text ="{Binding Path = FirstArgument}"   Name="textBox1" VerticalAlignment="Top" />
        <Label Margin="28,106,0,128" Name="Number2" Width="58" HorizontalAlignment="Left">Number1</Label>
        <TextBox Height="28" Margin="112,120,46,120" Text ="{Binding  Path = secondargument}" Name="textBox2" />
        <Label Height="28" Margin="28,0,0,75" Name="label1" VerticalAlignment="Bottom" HorizontalAlignment="Left" Width="58">Number2</Label>
        <TextBox Height="23" Margin="112,0,46,68" Name="textBox3" Text="{Binding Path = Addedargument}" VerticalAlignment="Bottom" />
        <Button Height="23"  HorizontalAlignment="Left" Margin="39,0,0,16" Name="button1" VerticalAlignment="Bottom" Width="75" Command="{Binding AddNew}">Button</Button>
    </Grid>
</Window>

The error occurs when i instantiate the database connection class in the viewmodel. The issue gets resolved when i comment out the databaseconnetion class.

ViewModel.cs:

using addition.Model;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.Design;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;
using System.ComponentModel;

namespace addition.ViewModel
{
    class ViewModel : INotifyPropertyChanged
    {
        private Number n1 = new Number();
        int num, num1;
//The issue is resolved when i comment the below instantiation

        databaseconnection d1 = new databaseconnection();

        public RelayCommand AddNew { get; set; }

        private string _number1;

        public string FirstArgument
        {

            get { return this._number1; }
            set
            {
                this._number1 = value;
                if (int.TryParse(_number1.ToString(), out num))
                {
                    this.n1.number1 = num;
                    this.OnPropertyChanged("FirstArgument");

                }
                else { MessageBox.Show("The given Value is not a Number "); }

            }
        }
        private string _number2;

        public string secondargument
        {
            get { return this._number2; }

            set
            {
                this._number2 = value;
                if (int.TryParse(_number2.ToString(), out num1))
                {
                    this.n1.number2 = num1;
                    this.OnPropertyChanged("secondargument");
                }
                else { MessageBox.Show("The given Value is not a Number "); }

            }
        }

        private string _number3;

        public string Addedargument
        {
            get { return this._number3; }
            set
            {
                this._number3 = value;
                this.OnPropertyChanged("Addedargument");
            }
        }

        public ViewModel()
        {

                AddNew = new RelayCommand(o => AddNumbers());

        }


        public void AddNumbers()
        {

                d1.data(this);


        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        #endregion

    }


    class databaseconnection
    {
        static string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MYConnectionString"].ConnectionString;
        public void data(ViewModel m1)
        {
            string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MYConnectionString"].ConnectionString;

//The query is prone to sql injection 

        string sql = "SELECT " + "( cast( " + m1.FirstArgument +" as int) + " + "cast( " + m1.secondargument + " as int) )" + " as Addedargument";
            // MessageBox.Show(sql);
            DataSet ds = new DataSet();
            using (var connection = new SqlConnection(connectionString))
            {
                using (var command = new SqlCommand(sql, connection))
                {
                    SqlDataAdapter dataadapter = new SqlDataAdapter(command);
                    connection.Open();
                    using (SqlDataReader reader = command.ExecuteReader())
                    {

                        if (reader.Read())
                        {

                            m1.Addedargument = reader["Addedargument"].ToString();
                        }
                    }
                }
            }
        }
    }
}

Question:

  • since I'm new to wpf via mvvm I'm not sure whether database connection should happen in ViewModel or in Model. Please let me know whether my approach is correct.
  • Why I'm getting the error when i instantiate the class even though the program and logic works fine in runtime. The issue is I can't able to design the application due to the error. The error occurs in

     <Window.DataContext> <vm:ViewModel/> </Window.DataContext>

我认为您应该在类databaseconnection注释静态字段static string connectionString或在类构造函数中初始化该字段。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM