Tło

Mam więc harmonogram danych, które są udostępniane na wielu viewmodels w mojej aplikacji WPF. Postanowiłem więc umieścić go w klasie statycznej, która może być łatwo dostępna z dowolnego WILDMODEL, który jej potrzebuje.

Klasa statyczna posiada obserwujColekcję danych harmonogramu (ScheduleObject), czego potrzebuję (w tym czasy, operacje do wykonania itp.).

Gdy konkretny VM chce użyć danych, wywołuje statyczną obserwowalną kolekcję za pomocą funkcji statycznej i próbuje umieścić ScheduleObject wewnątrz nowej klasie opakowania, którą wykonałem ScheduleDisplayObject, który dodaje zmienną SolidColorBrush Więc jestem w stanie podświetlić różne języki z różnymi kolorami opartymi na różnych warunkach.

problem

Po uruchomieniu programu, moje elementyControl, że obserwuje DisplayObjects} jest przymocowany do wypełnienia zgodnie z przeznaczeniem. W konstruktorze VM staram się ustawić kolor w klasie opakowania do czegoś innego, aby wskazać pewne elementy kontrolu. Nie aktualizuje. Nie jestem w stanie zaktualizować koloru w klasie opakowania. Teraz zakładam, że jest to dlatego, że za każdym razem, gdy poniższy) nazywa się ponownie, wywołuje Getter ponownie i odtwarza całą listę opakowań bez moich modyfikacji kolorów.

Zastanawiam się, co jest lepszym sposobem na osiągnięcie tego, co próbuję zrobić.

Cały odpowiedni kod jest poniżej. RaisePropertyChanged i ObservableClass są implementacjami INotifyPropertyChanged. Daj mi znać, jeśli masz jakieś pytania!

public VM
{
        /// <summary>
        /// A UI consumable list of display objects that hold tube schedule information
        /// </summary>
        public ObservableCollection<ScheduleDisplayObject> DisplayObjects
        {
            get
            {
                var list = new ObservableCollection<ScheduleDisplayObject>();
                foreach (ScheduleObject item in ScheduleManager.getList())
                {
                    list.Add(new ScheduleDisplayObject(item));
                }
                return list;
            }
        }


        public VM()
        {
            DisplayObjects[0].BackgroundColor = new SolidColorBrush(Colors.Red); //This doesn't do anything
        }
}


public static class ScheduleManager
{
        static ObservableCollection<ScheduleObject> ScheduleObjects = new ObservableCollection<ScheduleObject>();

        public static ObservableCollection<ScheduleObject> getList()
        {
            return ScheduleObjects;
        }
}



    public class ScheduleDisplayObject : ObservableClass
    {

        #region Declarations
        private SolidColorBrush _backgroundColor;
        /// <summary>
        /// Background color of the UI item
        /// </summary>
        public SolidColorBrush BackgroundColor
        {
            get { return _backgroundColor; }
            set
            {
                _backgroundColor = value;
                RaisePropertyChanged();
            }
        }

        private ScheduleObject _scheduleObject;
        /// <summary>
        /// Object containing schedule data for each tube
        /// </summary>
        public ScheduleObject ScheduleObject
        {
            get { return _scheduleObject; }
            set
            {
                _scheduleObject = value;
                RaisePropertyChanged();
            }
        }
        #endregion

        #region Constructor
        public ScheduleDisplayObject(int r, int c)
        {
            ScheduleObject = new ScheduleObject(r, c);
        }

        public ScheduleDisplayObject(ScheduleObject s)
        {
            ScheduleObject = s;
        }
        #endregion
    }

    public class ScheduleObject : ObservableClass
    {
        //Data (strings, doubles, ints, etc)

    }


0
BWhelan 24 grudzień 2019, 19:08

1 odpowiedź

Najlepsza odpowiedź

Możesz spróbować dodać pola podkładowego dla ObservableCollection<ScheduleDisplayObject>, zapobiega nadpisywaniu za każdym razem

private ObservableCollection<ScheduleDisplayObject> _displayObjects;
public ObservableCollection<ScheduleDisplayObject> DisplayObjects
{
    get
    {
        if (_displayObjects == null)
        {
            _displayObjects = new ObservableCollection<ScheduleDisplayObject>();
            foreach (ScheduleObject item in ScheduleManager.getList())
            {
                _displayObjects.Add(new ScheduleDisplayObject(item));
            }
        }

        return _displayObjects;
    }
}

Jeśli aktualizujesz te informacje w czasie wykonywania aplikacji, będzie miało sens, aby wdrożyć zarówno Getter, jak i Setter do zbierania, aby odzwierciedlić zmiany danych

1
Pavel Anikhouski 24 grudzień 2019, 16:21