2013-10-05 22 views
0

我試圖通過MVVM模式獲得WPF技能。我幾乎完全形式的基本功能,但面臨兩個問題Gridview更改事件不會觸發,以及插入記錄後如何刷新網格?

1)我的GridView更改事件不觸發 2)如何刷新電網插入記錄

我的視圖模型和視圖代碼如下

給出視圖模型

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 

    } 
} 

查看

<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> 

請指導,也給我的SQL CRUD功能的任何實際應用的裁判如果可能的話,我可以提高我的技能。

感謝

+0

首先,在您綁定的工作? – Tico

+0

用戶的ObservableCollection,而不是數據表。 –

+0

嗨天工,是我的控制具有約束力,結果顯示在列表視圖 –

回答

0

數據表不執行INotifyPropertyChanged,這樣你纔會有問題,直接綁定到它。您將看到初始數據,但對數據的更改不會反映在視圖中。

我想說的最簡單的選擇是使用DataView,其中確實實現INotifyPropertyChanged。您可以輕鬆地通過使用_tblContacts.DefaultView得到您的表的視圖。

0

@Rob H,我改變我的邏輯有點好好想想,現在我得到了我的價值觀和記錄還插入,但現在唯一的問題是GridView控件不insertionof記錄後,令人耳目一新。

請查看下面的代碼。

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 

    } 
} 

查看

<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> 
相關問題