2011-02-07 3 views
0

목록 데이터를 저장하는 데 문제가 있습니다. 새 데이터를 추가하면 이전 데이터가 다시 쓰여지고 목록에는 여전히 하나의 항목 만 있습니다.목록의 원하지 않는 다시 쓰기 데이터

이 메소드의 기본 메소드는 OpenChatScreen 메소드입니다. ChatScreenManager 클래스의 메소드는 problen의 루트입니다. 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); 
     } 
    } 

코드 : I 사전 또는 목록을 사용하는 경우

   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); 
      } 

그래서 나는 다른 클래스의 목록에 DetailData의 방법 OpenTabChatWindow 객체 유형 및 저장 솜 문자열 속성에서 통과하지만,이 객체에 동일한 기준을 사용하여 목록에있는 데이터를 다시 작성합니다.

나는 개체의 새 insatce 만들려고 :

   IDetailData oponent = new DetailData(); 

       oponent = Service.DetailData(Account, nick); 

을 그리고 문제 방법이 개체를 전달하지만, 그것을 해결하지 않았다.

+0

ActiveChatScreens는 어떤 데이터 유형입니까? –

+0

Sory, 내 실수, 내 질문을 편집했습니다. 그것은 목록이거나 사전 일 수도 있습니다. 문제는 동일합니다. 나는 상대방을 저장합니다. 정보. 닉을 콜렉션에 저장하십시오. 그러나 대상 상대에게 동일한 참조를 사용하고 목록의 항목을 다시 작성합니다. –

+0

사전에서 동일한 참조를 사용하면 이전 내용을 덮어 써야합니다. 새 메시지를 추가하려는 경우 messageid를 키로 사용해야하며 포함 된 개체에는 who 및 what에 대한 속성이 있어야합니다. 이 경우입니까, 아니면 새 채팅 창을 열려고하는 것입니까? 그런 다음 덮어 쓰는 것이 왜 문제입니까? –

답변

0

이제 귀하의 사례를 이해합니다.

ActiveChatScreens에 개체를 추가합니다.

처음에는 OpenChatScreen 호출에서 동일한 객체를 재사용 할 수 있습니까?

이드가 변경되면 상대방이 변경되며이 참조가 변경되기 전에 참조가 변경됩니다.

개체는 참조 구조이므로 데이터를 변경하더라도 참조는 여전히 동일합니다.

+0

네, 맞습니다. ChatShellViewModel 클래스는 싱글 톤입니다 ->이 경우이 문제가 발생합니다. 고맙습니다. –