0
votes

am completely new to MVVM. I was trying to bind the data from sqlserver to the Datagrid in WPF and perform Edit, update and delete operations on it. now, am unable to bind the data from sqlserver to datagrid atleast using observable collection in MVVM.... someone please help me out to resolve it and also kindly let me know how to implement the edit,update and delete operations for the same datagrid....am totally getting confused implementing the MVVM architecture..

with the following code I could bind the data to "Empdata"(observablecollection) but the datagrid is not being displayed at all.

the following is my xaml code :

<DataGrid    ItemsSource="{Binding Path=Empdata}" x:Name="dtgrdemp"
             AutoGenerateColumns="False"
             SelectionMode="Single"
             SelectionUnit="FullRow"
             GridLinesVisibility="Horizontal"
             CanUserDeleteRows="True"
             CanUserAddRows="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" Width="SizeToCells" MinWidth="125" Binding="{Binding Path=Ename}"/>
        <DataGridTextColumn Header="Age" Width="SizeToCells" MinWidth="200" Binding="{Binding Path=Eage}"/>
        <DataGridTextColumn Header="Description" Width="SizeToCells" MinWidth="200" Binding="{Binding Path=Edescription}"/>
    </DataGrid.Columns></Datagrid>

the following is my code for "view" where i took a class as person

public class Person : INotifyPropertyChanged, IDataErrorInfo
{
    private string names;

    public string Names
    {
        get { return names; }
        set
        {
            names = value;
            OnPropertyChanged("Names");
        }
    }

    private int age;

    public int Age
    {
        get { return age; }
        set
        {
            age = value;
            OnPropertyChanged("Age");
        }
    }

    private string description;

    public string Description
    {
        get { return description; }
        set
        {
            description = value;
            OnPropertyChanged("Description");
        }
    }



    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyname)
    {
        var handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyname));
    }

    public string Error
    {
        get { return null; }
    }

    public string this[string columnName]
    {
        get
        {
            string error = null;
            switch (columnName)
            {
                case "Names":
                    if (string.IsNullOrEmpty(names))
                    {
                        error = "First Name required";
                    }
                    break;

                case "Age":
                    if ((age < 18) || (age > 85))
                    {
                        error = "Age out of range.";
                    }
                    break;
                case "Description":
                    if (string.IsNullOrEmpty(description))
                    {
                        error = "Last Name required";
                    }
                    break;
            }

            return (error);
        }
    }

the following is my code for "ViewModel" class

public class MainViewModel :INotifyPropertyChanged
{
    string con = ConfigurationSettings.AppSettings["ConnectionStrings"];
    ObservableCollection<EmpInfo> Empdata= new ObservableCollection<EmpInfo>();

    private Person empperson;

    public Person Empperson
    {
        get { return empperson; }
        set { empperson = value; }
    }

    public MainViewModel()
    {
        initializeload();
    }

    private void initializeload()
    {
        DataTable dt = new DataTable();
        Empdata = new ObservableCollection<EmpInfo>();
        Empdata.Add(new EmpInfo(dt));
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyname)
    {
        var handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyname));
    }
}

the following is the code for EmpInfo.cs class

public EmpInfo(DataTable dt)
{
    SqlConnection sqlcon = new SqlConnection(con);
    sqlcon.Open();
    SqlDataAdapter da = new SqlDataAdapter("Select Ename,Eage,Edescription from EmployeeTable", sqlcon);
    da.Fill(dt);
    this.dt = dt;
}

the following is the code in Appxaml.cs

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);
    var mainWindow = new MainWindow();
    var viewModel = new MainViewModel();
    mainWindow.DataContext = viewModel;
    mainWindow.Show();
}
3

3 Answers

3
votes

Your code Empdata.Add(new EmpInfo(dt)); isn't populating the observable collection Empdata with anything!

Atleast thats what your constructor

   public EmpInfo(DataTable dt)  

confirms. Where is the code that populates the employee object by Age, Description and Name?

1
votes

You can only DataBind Properties that are marked as PUBLIC.

Your Observable collection is internal.

0
votes

You have to create a CollectionViewSource object and assign your ObservableCollection to its source property :

public CollectionViewSource datasource {get;set;}

...


datasource = new CollectionViewSource { Source = yourObservableCollection };
// you can do some sorting or grouping stuff here

your Binding should then look like:

<DataGrid ItemsSource="{Binding Path=datasource.View}" x:Name="dtgrdemp"