8

Próbuję powiązać obserwowalną kolekcję z DataGrid, chcę powiadomić, gdy dowolny wiersz jest edytowany w datagrid. Mój kod działa poprawnie, jeśli chodzi o powiadamianie o dodaniu lub usunięciu rekordu, ale nie jest informowany podczas edycji rekordu. Proszę dać mi znać, jeśli jest to właściwy sposób wiązania przy użyciu obserwowalnej kolekcji w MVVM i czy czegoś brakuje. Z góry dziękuję.Obserwowalna kolekcja Powiadom o zmianie właściwości w MVVM

public class studentViewModel : INotifyPropertyChanged 
{ 
    #region constructor 

    public studentViewModel() 
    { 
     _student = new studentModel(); 
     myCollection = new ObservableCollection<studentModel>(); 
     myCollection.Add(_student); 
     myCollection.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(myCollection_CollectionChanged); 

    } 

    void myCollection_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 
     //throw new NotImplementedException(); 
     System.Windows.MessageBox.Show(e.Action.ToString()); 
    } 

    #endregion 

    #region properties 

    studentModel _student; 
    ObservableCollection<studentModel> _myCollection; 

    public ObservableCollection<studentModel> myCollection 
    { 
     get { return _myCollection; } 
     set 
     { 
      if (_myCollection != value) 
      { 
       _myCollection = value; 
       raisePropertyChange("myCollection"); 
      } 
     } 
    } 

    public int rollNo 
    { 
     get { return _student.rollNo; } 
     set 
     { 
      if (value != _student.rollNo) 
      { 
       _student.rollNo = value; 
       raisePropertyChange("rollNo"); 
      } 
     } 
    } 

    public string firstName 
    { 
     get { return _student.firstName; } 
     set 
     { 
      if (value != _student.firstName) 
      { 
       _student.firstName = value; 
       raisePropertyChange("firstName"); 
      } 
     } 
    } 

    public string lastName 
    { 
     get { return _student.lastName; } 
     set 
     { 
      if (value != _student.lastName) 
      { 
       _student.lastName = value; 
       raisePropertyChange("lastName"); 
      } 
     } 
    } 

    #endregion 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 


    public void raisePropertyChange(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this,new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    #endregion 
} 

public class studentModel 
{ 
    public int rollNo { get; set; } 
    public string firstName { get; set; } 
    public string lastName { get; set; } 
} 

I XAML jest

<Window.Resources> 
    <local:studentViewModel x:Key="StudentsDetails" /> 
</Window.Resources> 
<Grid DataContext="{StaticResource StudentsDetails}"> 
    <DataGrid ItemsSource="{Binding Path=myCollection, Source={StaticResource StudentsDetails}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
       Name="studentsGrid" CanUserAddRows="True" AutoGenerateColumns="True"> 

    </DataGrid> 
</Grid> 

Odpowiedz

7

ObservableCollection powiadomi UI gdy rekord dodaniu lub usunięciu ale nie gdy rekord jest edytowany. To zależy od obiektu, który został zmieniony, aby powiadomić, że się zmienił.

W przypadku, gdy wiersz jest modyfikowany, typ obiektu, który został zmieniony, to studentModel.
Dlatego, jeśli chcesz UI, aby otrzymywać powiadomienia, gdy ten przedmiot ulega zmianie, trzeba implement INotifyPropertyChanged na studentModel też ..

np

public class studentModel : INotifyPropertyChanged 
    .....