简体   繁体   English

Gridview Change事件未触发,插入记录后如何刷新网格?

[英]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. 我试图通过MVVM模式获得WPF技能。 i almost complete form with basic features but facing 2 problems 我几乎完成了具有基本功能的表格,但面临2个问题

1) My Gridview Change Event not firing 2) How to refresh the grid after Inserting Record 1)我的Gridview更改事件未触发2)插入记录后如何刷新网格

My ViewModel and View code is given below 我的ViewModel和View代码如下

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. 请指导,如果可能的话,还可以给我提供有关sql crud函数的任何实际应用的参考,我可以从中提高自己的技能。

Thanks 谢谢

DataTable does not implement INotifyPropertyChanged, so you will have issues binding directly to it. DataTable没有实现INotifyPropertyChanged,因此您将直接绑定有问题。 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. 我会说最简单的选择是使用DataView,它确实实现了INotifyPropertyChanged。 You can easily get a view for your table by using _tblContacts.DefaultView . 您可以使用_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. @Rob H,我改变了一下逻辑,我想我现在正在获取值并同时插入记录,但是现在唯一的问题是在插入记录后gridview没有刷新。

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>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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