Observable Collection Benachrichtigen, wenn die Eigenschaft geändert in MVVM
Ich versuche mich zu binden beobachtbaren Sammlung DataGrid, ich will Benachrichtigen, wenn jede Zeile bearbeitet wird, in datagrid.
Mein code funktioniert gut für notifing wenn Datensatz Hinzugefügt oder entfernt, aber nicht notifing wenn Datensatz bearbeitet wird.
Bitte lassen Sie mich wissen, ob dies die richtige Art und Weise der Bindung mit observable-collection in MVVM und ob ich das bin, fehlt etwas. Vielen Dank im Voraus.
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>
Du musst angemeldet sein, um einen Kommentar abzugeben.
ObservableCollection benachrichtigt die Benutzeroberfläche, wenn ein Datensatz Hinzugefügt oder entfernt werden, aber nicht wenn ein Datensatz bearbeitet wird. Es ist bis zu dem Objekt, das geändert wurde, zu Benachrichtigen, dass er sich verändert hat.
In Ihrem Fall, wenn eine Zeile geändert wird, den Typ des Objekts, das geändert wird, ist
studentModel
.Deshalb, wenn Sie die Benutzeroberfläche, um benachrichtigt zu werden, wenn das Objekt geändert wird, müssen Sie die INotifyPropertyChanged implementieren auf
studentModel
auch..z.B.