Нежелательные перезаписи данных в списке - PullRequest
0 голосов
/ 07 февраля 2011

У меня проблема с хранением данных в списке.Если я добавляю новые данные, они перезаписывают старые данные, и в списке остается только один элемент.

Вот основной метод, из этого метода я вызываю метод OpenChatScreen, это метод класса ChatScreenManager, где находится корень проблемной.

    private void OpenTabChatWindow(string nick)
    {
        try
        {
            new System.Threading.Tasks.Task(() =>
            {
                IDetailData oponent = new DetailData();

                oponent = Service.DetailData(Account, nick);

                Execute.OnUIThread((System.Action)(() =>
                {
                    //here I call problem method OpenChatScreen method where is the problem,
                    //it use still the same reference on object opponent
                    if (ChatScreenManager.OpenChatScreen(true, Account, oponent, Account.DetailData.Info.Nick))
                    {
                        AddConversationHistory(nick);
                    }

                }));
            }

            ).Start();
        }
        catch (Exception exception)
        {
            MsgBox.ShowException(exception);
        }
    }   

Код из класса ChatScreenManager:

             public IDictionary<string,object> ActiveChatScreens { get; set; }

or 
             public IList<string,> ActiveChatScreens { get; set; }

Проблема такая же, если я использую словарь или список.

       public bool OpenChatScreen(bool useTabChat, IAccount account, IDetailData oponent, string avatarNick)
            {
                if (!ActiveChatScreens.Contains(oponent.Info.Nick))
                {
                    if(useTabChat)
                    {
    //in this method - OpenTabChat is problem
                        OpenTabChat(account, oponent, avatarNick);
                        return true;
                    }
                }
                return false;
            }

            private void OpenTabChat(IAccount account, IDetailData oponent, string avatarNick)
            {
                if (!ChatShellViewModel.IsActive)
                {
                    OpenChatShell();
                }

                ChatShellViewModel.OpenChatTab(account, oponent, avatarNick);

//here is the root of problem, it use same reference of object opponent
                ActiveChatScreens.Add(oponent.Info.Nick);
            }

Поэтому я перехожу из метода OpenTabChatWindow объекта типаDetailData и сохраняют свойство строки som в List в другом классе, но используют ту же ссылку на этот объект и перезаписывают данные в списке.

Я пытаюсь создать новое представление объекта:

                IDetailData oponent = new DetailData();

                oponent = Service.DetailData(Account, nick);

Ипередать этот объект методу задачи, но он не решил его.

1 Ответ

0 голосов
/ 07 февраля 2011

Теперь, если я понимаю ваши примеры.

Вы добавляете объекты в ActiveChatScreens.

Возможно, вы повторно используете один и тот же объект при вызове OpenChatScreen.

То есть, тогда оппонент изменится, и любая ссылка на него также изменится до того, как эти методы даже будут вызваны?

Помните, что объекты являются ссылочными структурами, даже если вы измените данные в них, ссылка останется прежней.

...