Witam.
Mam tablicę/listę wartości lub kolekcję obiektów (np. lista, kolejka). Wartości w tablicy/liście lub obiekty (wartości w polach obiektów) zmieniają się.
Jakiego rozwiązania użyć by "monitorować/śledzić" zmiany wartości na konkretnych pozycjach tablicy/listy lub w obiektach i w przypadku ich wystąpienia od razu wykonać jakąś akcję? Nie chodzi mi to o dodawanie/usuwanie pozycji z listy/kolekcji a dokładnie o zmianę wartości.
INotifyPropertyChanged. Zaimplementuj ten interfejs w klasie obiektów umieszczanych w tablicy i potem możesz subskrybować zdarzenie PropertyChanged i na nie reagować, wiesz z jakiego obiektu przyszło i co się zmieniło.
ObservableCollection<T> jeżeli jednak chcemy śledzić dodawanie/usuwanie z listy.
Nie wiem czy dobrze to robię, mam klasę (przykładowo - klasę Person)
public class Person : INotifyPropertyChanged
{
private string imie = string.Empty;
private string nazwisko = string.Empty;
private Guid numer = Guid.NewGuid();
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName]string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
Console.WriteLine("zmieniono coś");
}
public string Imie
{
get
{
return imie != null?imie:"NA";
}
set
{
if (value != this.imie)
{
imie = value;
NotifyPropertyChanged("Imie");
}
}
}
public string Nazwisko
{
get
{
return nazwisko!=null?nazwisko:"NA";
}
set
{
nazwisko = value;
}
}
public Guid Numer {
get {
return numer;
}
set {
if (value != this.numer)
{
numer = value;
NotifyPropertyChanged("Numer");
}
numer = value;
}
}
public Person () { }
public Person (string imie, string nazwisko, Guid numer)
{
this.imie = imie;
this.nazwisko = nazwisko;
this.numer = numer;
}
public override string ToString()
{
return imie + " " + nazwisko + numer;
}
}
Klasa ta wykorzystywana jest w programie do tworzenia listy obiektów (przykładowo):
listaOsob.Add(new Person("Rafal", "Nowak", Guid.NewGuid()));
listaOsob.Add(new Person("Jarosław", "Nowak", Guid.NewGuid()));
listaOsob.Add(new Person("Marek", "Nowak", Guid.NewGuid()));
listaOsob.Add(new Person("Adam", "Nowak", Guid.NewGuid()));
listaOsob.Add(new Person("Ewelina", "Nowak", Guid.NewGuid()));
Teraz przykładowo zmieniam Numer obiektu, którego property Imie == "Marek" (kod podpięty pod button):
//znalezienie obiektu w liście
Person znalezionaOsoba = listaOsob.Find(item => item.Imie == "Marek");
if (znalezionaOsoba != null)
{
//zmiana obiektu w liście
znalezionaOsoba.Numer = Guid.NewGuid();
}
Za każdym razem na konsoli wyświetla ..."zmieniono coś" czyli jakby działa.
Z kolei teraz przykładowo zmieniam "Imie" obiektu, którego property Imie == "Marek" (kod podpięty pod button):
//znalezienie obiektu w liście
Person znalezionaOsoba = listaOsob.Find(item => item.Imie == "Marek");
if (znalezionaOsoba != null)
{
//zmiana obiektu w liście
znalezionaOsoba.Imie = "XXX";
}
Tutaj tylko raz pojawia się "zmieniono coś" czyli wydaje się też ok.
Pytanie, gdzie w takim razie powinienem umieścić kod, który po wykryciu zmiany wykona jakąś akcję (logowanie do pliku, bazy danych, wyświetlanie alertu na stronie itp)?
w funkcji NotifyPropertyChanged
w property name bedziesz miec kontorlke ktora zostala aktywowana. Na podstawie tego mozesz zrobic sobie juz co tam chcesz