본문 바로가기
프로그래밍/App 개발

[C#, Xamarin] Call by value, deep copy

by 엽기토기 2021. 6. 16.
반응형
if (!(BindingContext is DFDream dream)) return;
MessagingCenter.Send(this, MessagingCenterMessages.AddWizardDream, dream));

이렇게 하고 dream을 수정하니까 추가된 dream들이 다 같이 수정되어버림.


DFDream에 Clone() 메소드를 추가.

 public object Clone()
        {
            return new DFDream
            {
                Id = this.Id,
                ProfileImage = this.ProfileImage,
                ...
            };
        }

 

(DFDream)dream.Clone()으로 넘김.

private async void OnStartDreamButtonTapped(object sender, EventArgs e)
        {
            DependencyService.Get<IDFVibration>().VibrateShort();

            if (!(BindingContext is DFDream dream)) return;
            MessagingCenter.Send(this, MessagingCenterMessages.AddWizardDream, (DFDream)dream.Clone());
            ...

 

받는 곳에서는 id값을 변경.

MessagingCenter.Subscribe<DFDiscoverDetailPage, DFDream>(this, MessagingCenterMessages.AddWizardDream, async (sender, dream) =>
            {
                dream.Id = (++DFDreamSource.NumberOfLastID).ToString();
                DFDreamSource.dreamSource.Add(dream);
                DreamListToDisplay.Add(dream);
                if (Navigation.NavigationStack.Count > 0)
                {
                    try
                    {
                        await Navigation.PopAllPopupAsync();
                    }
                    catch
                    {

                    }
                }
                await Navigation.PushPopupAsync(DreamAddedPopup.Instance);
            });

 


버그 해결!

반응형