简体   繁体   中英

Gridview Change event not firing and how to refresh the grid after inserting a record?

I an trying to get skills on WPF with MVVM pattern. i almost complete form with basic features but facing 2 problems

1) My Gridview Change Event not firing 2) How to refresh the grid after Inserting Record

My ViewModel and View code is given below

View Model

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows.Input;
using DatabaseLayer;
using System.Data;

namespace WPFnMVVM.ViewModel 
{
    public class ContactsViewModel : WPFnMVVM.Common.VMBase
    {
        #region Variables
        private int _Id;
        private string _First_Name;
        private string _Last_Name;
        private DateTime _DOB;
        private clstbl_Contacts _Contacts;
        public WPFnMVVM.Common.RelayCommand _addCommand;
        public DataTable _tblContacts;
        #endregion

        public ContactsViewModel()
        {

            _tblContacts = LoadContacts();
        }


        #region Public Properties
        public int Id
        {
            get { return _Id; }
            set { _Id = value; OnPropertyChanged("Id"); }
        }
        public string First_Name
        {
            get { return _First_Name; }
            set { _First_Name = value; OnPropertyChanged("First_Name"); }
        }
        public string Last_Name
        {
            get { return _Last_Name; }
            set { _Last_Name = value; OnPropertyChanged("Last_Name"); }
        }
        public DateTime DOB
        {
            get { return _DOB; }
            set { _DOB = value; OnPropertyChanged("DOB"); }
        }
        public clstbl_Contacts Contacts
        {
            get { return _Contacts; }
            set
            {
                _Contacts = value;
                OnPropertyChanged("Contacts");
            }


        }

        public DataTable ContactsList
        {
            get { return _tblContacts; }
            set
            {
                _tblContacts = value;
                OnPropertyChanged("ContactsList");
            }
        }
        #endregion

        #region Private Methods
        private DataTable LoadContacts()
        {
            clstbl_Contacts objContact = new clstbl_Contacts(WPFnMVVM.Common.clsSettings.ConStr);
            {
                return objContact.Select();


            };
        }

        private void AddContacts()
        {
            clstbl_Contacts objContacts = new clstbl_Contacts(WPFnMVVM.Common.clsSettings.ConStr);
            objContacts.First_Name = First_Name;
            objContacts.Last_Name = Last_Name;
            objContacts.DOB = DOB;
            objContacts.Insert();
        }

        #endregion

        #region Commands
          public ICommand AddCommand
        {
            get
            {
                if (_addCommand == null)
                {
                    _addCommand = new WPFnMVVM.Common.RelayCommand(
                        param => this.AddContacts(),
                        param => true
                        );
                }
                return _addCommand;
            }
        }
        #endregion

    }
}

View

<Window x:Class="WPFnMVVM.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:VM="clr-namespace:WPFnMVVM.ViewModel"
        xmlns:View="clr-namespace:WPFnMVVM"
        Title="MainWindow" Height="350" Width="337">
    <Window.DataContext>
        <VM:ContactsViewModel/>
    </Window.DataContext>
    <Grid Name="MyGrid">
        <TextBox HorizontalAlignment="Left" Height="23" Margin="95,13,0,0" TextWrapping="Wrap" Text="{Binding Path=First_Name, UpdateSourceTrigger=PropertyChanged}"  VerticalAlignment="Top" Width="120" />
        <TextBox HorizontalAlignment="Left" Height="23" Margin="95,47,0,0" TextWrapping="Wrap" Text="{Binding Path=Last_Name, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="120"/>
        <Label Content="First Name" HorizontalAlignment="Left" Margin="8,10,0,0" VerticalAlignment="Top"/>
        <Label Content="Last Name" HorizontalAlignment="Left" Margin="9,47,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.68,1.974"/>
        <Label Content="DOB" HorizontalAlignment="Left" Margin="8,75,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.68,1.974"/>
        <DatePicker Height="25" HorizontalAlignment="Left" Margin="95,76,0,0" Name="datePicker1"
            VerticalAlignment="Top" Width="120" SelectedDate="{Binding Path=DOB, UpdateSourceTrigger=PropertyChanged}"/>
        <Button Content="Add" HorizontalAlignment="Left" Margin="9,118,0,0" VerticalAlignment="Top" Width="75" Command="{Binding Path=AddCommand}"/>
        <Button Content="Update" HorizontalAlignment="Left" Margin="102,118,0,0" VerticalAlignment="Top" Width="75"/>
        <Button Content="Delete" HorizontalAlignment="Left" Margin="193,118,0,0" VerticalAlignment="Top" Width="75"/>
        <ListView BorderBrush="White" ItemsSource="{Binding Path=ContactsList, UpdateSourceTrigger=PropertyChanged}"
                   HorizontalAlignment="Stretch" Margin="11,156,10,10" SelectedValue="{Binding Path=Contacts, UpdateSourceTrigger=PropertyChanged}">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="First Name" 
                                    DisplayMemberBinding="{Binding Path=First_Name}" Width="70" />
                    <GridViewColumn Header="Last Name"
                                    DisplayMemberBinding="{Binding Path=Last_Name}" Width="70" />
                    <GridViewColumn Header="DOB" 
                                    DisplayMemberBinding="{Binding Path=DOB}" Width="70" />

                </GridView>
            </ListView.View>
        </ListView >

    </Grid>
</Window>

Please guide and also give me ref of any practical application with sql crud functions if possible from which i can enhance my skills.

Thanks

DataTable does not implement INotifyPropertyChanged, so you will have issues binding directly to it. You'll see the initial data but then changes to the data will not be reflected in the view.

I'd say the easiest alternative is to use a DataView, which does implement INotifyPropertyChanged. You can easily get a view for your table by using _tblContacts.DefaultView .

@Rob H , I change my logic a bit a good think is now i am getting my values and record also inserting but now the only problem is gridview is not refreshing after insertionof record.

please view a code below.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows.Input;
using DatabaseLayer;
using System.Data;

namespace WPFnMVVM.ViewModel 
{
    public class ContactsViewModel : WPFnMVVM.Common.VMBase
    {
        #region Variables
        private int _Id;
        private string _First_Name;
        private string _Last_Name;
        private DateTime _DOB;
        private clstbl_Contacts _Contacts;
        public WPFnMVVM.Common.RelayCommand _addCommand;
        public ObservableCollection<clstbl_Contacts> _ContactsList;
        #endregion

        #region Contructor
        public ContactsViewModel()
        {
            LoadContacts();
        }      
        #endregion

        #region Public Properties
        public int Id
        {
            get { return _Id; }
            set { _Id = value; OnPropertyChanged("Id"); }
        }
        public string First_Name
        {
            get { return _First_Name; }
            set { _First_Name = value;

                OnPropertyChanged("First_Name"); }
        }
        public string Last_Name
        {
            get { return _Last_Name; }
            set { _Last_Name = value; OnPropertyChanged("Last_Name"); }
        }
        public DateTime DOB
        {
            get { return _DOB; }
            set { _DOB = value; OnPropertyChanged("DOB"); }
        }
        public clstbl_Contacts Contacts
        {
            get { return _Contacts; }
            set
            {
                _Contacts = value;

                OnPropertyChanged("Contacts");
                GetValuesFromModel();
            }


        }
        public ObservableCollection<clstbl_Contacts> ContactsList
        {
            get { return _ContactsList; }
            set
            {
                _ContactsList = value;
                OnPropertyChanged("ContactsList");
            }
        }     
        #endregion

        #region Methods
        private void LoadContacts()
        {

            clstbl_Contacts objContact = new clstbl_Contacts(WPFnMVVM.Common.clsSettings.ConStr);
            DataTable dt = objContact.Select();
            _ContactsList = new ObservableCollection<clstbl_Contacts>();

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                _ContactsList.Add(new clstbl_Contacts { Id = Convert.ToInt16(dt.Rows[i]["ID"].ToString())
                                                        ,First_Name = dt.Rows[i]["First_Name"].ToString(),
                                                        Last_Name = dt.Rows[i]["Last_Name"].ToString(),
                                                        DOB = Convert.ToDateTime(dt.Rows[i]["DOB"].ToString())
                });
            }

        }
        private void AddContacts()
        {
            clstbl_Contacts objContacts = new clstbl_Contacts(WPFnMVVM.Common.clsSettings.ConStr);
            objContacts.First_Name = First_Name;
            objContacts.Last_Name = Last_Name;
            objContacts.DOB = DOB;
            objContacts.Insert();

        }

        private void GetValuesFromModel()
        {
            Id = _Contacts.Id;
            First_Name = _Contacts.First_Name;
            Last_Name = _Contacts.Last_Name;
            DOB = _Contacts.DOB;
        }
        #endregion

        #region Commands
          public ICommand AddCommand
        {
            get
            {
                if (_addCommand == null)
                {
                    _addCommand = new WPFnMVVM.Common.RelayCommand(
                        param => this.AddContacts(),
                        param => true
                        );
                }
                return _addCommand;
            }
        }
        #endregion

    }
}

View

<Window x:Class="WPFnMVVM.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:VM="clr-namespace:WPFnMVVM.ViewModel"
        xmlns:View="clr-namespace:WPFnMVVM"

        Title="MainWindow" Height="350" Width="337">
    <Window.DataContext>
        <VM:ContactsViewModel/>
    </Window.DataContext>
    <Grid Name="MyGrid">
        <TextBox HorizontalAlignment="Left" Height="23" Margin="95,13,0,0" TextWrapping="Wrap" 
                 Text="{Binding Path=First_Name, UpdateSourceTrigger=PropertyChanged}"   VerticalAlignment="Top" Width="120" />

        <TextBox HorizontalAlignment="Left" Height="23" Margin="95,47,0,0" TextWrapping="Wrap" Text="{Binding Path=Last_Name, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="120"/>
        <Label Content="First Name" HorizontalAlignment="Left" Margin="8,10,0,0" VerticalAlignment="Top"/>
        <Label Content="Last Name" HorizontalAlignment="Left" Margin="9,47,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.68,1.974"/>
        <Label Content="DOB" HorizontalAlignment="Left" Margin="8,75,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.68,1.974"/>
        <DatePicker Height="25" HorizontalAlignment="Left" Margin="95,76,0,0" Name="datePicker1"
            VerticalAlignment="Top" Width="120" SelectedDate="{Binding Path=DOB, UpdateSourceTrigger=PropertyChanged}"/>
        <Button Content="Add" HorizontalAlignment="Left" Margin="9,118,0,0" VerticalAlignment="Top" Width="75" Command="{Binding Path=AddCommand}"/>
        <Button Content="Update" HorizontalAlignment="Left" Margin="102,118,0,0" VerticalAlignment="Top" Width="75"/>
        <Button Content="Delete" HorizontalAlignment="Left" Margin="193,118,0,0" VerticalAlignment="Top" Width="75"/>
        <ListView BorderBrush="White" ItemsSource="{Binding Path=ContactsList, UpdateSourceTrigger=PropertyChanged}"
                   HorizontalAlignment="Stretch" Margin="11,156,10,10" SelectedValue="{Binding Path=Contacts, UpdateSourceTrigger=PropertyChanged}">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="First Name" 
                                    DisplayMemberBinding="{Binding Path=First_Name}" Width="70" />
                    <GridViewColumn Header="Last Name"
                                    DisplayMemberBinding="{Binding Path=Last_Name}" Width="70" />
                    <GridViewColumn Header="DOB" 
                                    DisplayMemberBinding="{Binding Path=DOB}" Width="70" />

                </GridView>
            </ListView.View>
        </ListView >

    </Grid>
</Window>

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