8

Ich versuche, beobachtbare Auflistung an DataGrid zu binden, ich möchte benachrichtigt werden, wenn eine Zeile in Datagrid bearbeitet wird. Mein Code funktioniert gut, um zu notieren, wenn ein Datensatz hinzugefügt oder entfernt wird, aber nicht, wenn der Datensatz bearbeitet wird. Bitte lassen Sie mich wissen, ob dies die richtige Art der Bindung mit beobachtbaren Sammlung in MVVM ist und ob ich etwas vermisse. Danke im Voraus.Observable Collection Benachrichtigung bei Änderung der Eigenschaft in 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; } 
} 

Und XAML ist

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

Antwort

7

Ein ObservableCollection wird die Benutzeroberfläche benachrichtigt werden, wenn ein Datensatz hinzugefügt oder entfernt wird, aber nicht, wenn ein Datensatz bearbeitet wird. Es liegt an dem Objekt, das geändert wurde, um zu melden, dass es sich geändert hat.

In Ihrem Fall ist der geänderte Objekttyp studentModel, wenn eine Zeile geändert wird.
Deshalb, wenn Sie die UI wollen informiert werden, wenn das Objekt geändert wird, müssen Sie implement INotifyPropertyChanged auf studentModel auch ..

z.B.

public class studentModel : INotifyPropertyChanged 
    .....