Akcja po zmianie wartości w tablicy/kolekcji

0

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.

3

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.

0

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

0

w funkcji NotifyPropertyChanged
w property name bedziesz miec kontorlke ktora zostala aktywowana. Na podstawie tego mozesz zrobic sobie juz co tam chcesz

1 użytkowników online, w tym zalogowanych: 0, gości: 1