Samo aktualizacja pola w liście chwilowej

0

Cześć,

Nie rozumiem tego i nic na ten temat nie mogę znaleźć w google.

Mam dwie skonwertowane listy z typu ObservableCollection jedną modyfikuje a druga ma służyć do sprawdzania w kolejnej funkcji co się zmieniło i nie rozumiem powodu że jak zmieniam jedną listę to w drugiej tez zmiana jest widoczna. Jak temu zapobiec.?

        string kat = "";
            BaseControlModel el = null;
            List<CategoryControlsModel> oldListCat = new List<CategoryControlsModel>(SelectedCategoryControlsViewModel.Category);
            List<CategoryControlsModel> l = SelectedCategoryControlsViewModel.Category.ToList();
            if (catcontrol.Equals(""))
            {
                kat = cats;
            }
            else
            {
                kat = catcontrol;
            }
            CategoryControlsModel ob = SelectedCategoryControlsViewModel.Category.ToList().Where(p => p.Id == kat).FirstOrDefault();
            if (catcontrol != "")
            {
                el = ob.Category.ToList().Where(p => p.Id == cats).FirstOrDefault();
            }
            var dialogService = ServiceLocator.Current.GetInstance<IDialogService>();
            CategoryControlsViewModel cat = new CategoryControlsViewModel();
            dialogService.ShowChangeNameAddTooltip(new ChangeNameAddTooltipViewModel(cat));
            if (el == null)
            {

               l.ToList().Where(p => p.Id == kat).FirstOrDefault((a) =>
                {
                    a.Id = cat.Id;
                    a.toolTip = cat.toolTip;
                    return true;
                });
            }
            else
            {


                l.ToList().Where(p => p.Id == kat).First().Category.Where(p => p.Id == cats).FirstOrDefault((a) =>
                {
                    a.Id = cat.Id;
                    a.toolTip = cat.toolTip;
                    return true;
                });

            }
          
            SelectedCategoryControlsViewModel.Category = new ObservableCollection<CategoryControlsModel>(l);

            this.packageService.SaveCategoryPackage(l.ToList(), oldListCat, kat, (exx) =>
             {
                 if (exx != null)
                 {
                     this.dialogService.ShowError(exx);
                     return;
                 }

                 //UclMessenger.Send<UclProject>(Project, MessageTokens.ProjectLoaded);
             });
0

Przez modyfikację listy rozumiesz usunięcie/dodanie elementu, czy zmianę jakiejś właściwości/pola elementu listy?

I w którym miejscu, w tym kodzie nic nie widać...

0
some_ONE napisał(a):

Przez modyfikację listy rozumiesz usunięcie/dodanie elementu, czy zmianę jakiejś właściwości/pola elementu listy?

I w którym miejscu, w tym kodzie nic nie widać...

W tym miejscu tworzę dwie listy robocze.

  List<CategoryControlsModel> oldListCat = new List<CategoryControlsModel>(SelectedCategoryControlsViewModel.Category);
  List<CategoryControlsModel> l = SelectedCategoryControlsViewModel.Category.ToList();

W tym miejscu modyfikuję listę "l"

            if (el == null)
            {
 
               l.ToList().Where(p => p.Id == kat).FirstOrDefault((a) =>
                {
                    a.Id = cat.Id;
                    a.toolTip = cat.toolTip;
                    return true;
                });
            }
            else
            {
 
                l.ToList().Where(p => p.Id == kat).First().Category.Where(p => p.Id == cats).FirstOrDefault((a) =>
                {
                    a.Id = cat.Id;
                    a.toolTip = cat.toolTip;
                    return true;
                });
 
            }

Po tej operacji okazuje się że lista l oraz lista oldListCat są zmodyfikowane a moim działaniem była tylko modyfikacja listy "l" bez ruszania listy "oldListCat ". Chciałbym się dowiedzieć gdzie popełniam błąd że modyfikowane są obie te listy a nie tylko lista "l"

0

Ale Ty nie modyfikujesz tej list w tym fragmencie kodu, tylko zmieniasz właściwości obiektów które są na tej liście. CategoryControlsModel jest zapewne klasą nie strukturą, a więc jest typu referencyjnego nie wartościowego, tworząc nowe listy za pomocą ToList() czy konstruktora dostajesz nową listę, ale wewnątrz są referencje do tych samych instancji obiektów.

Inaczej rzecz biorąc w takim sposób zrobiłeś tak zwane płytkie klonowanie/kopiowanie, a chcesz mieć głębokie klonowanie/kopiowanie list.

Głęboką kopie można zrobić na kilka sposób, jednym z nich jest chociażby:


List<CategoryControlsModel> oldListCat = SelectedCategoryControlsViewModel.Category.Select(x => new CategoryControlsModel(){Id  = x.Id , toolTip  = x.toolTip }).ToList();

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