2012-09-07 3 views
15

Windows 8 "Metro Styled Apps", MVVM Light를 사용해 본 결과 - 지금까지는 좋은 목표를 만들고 싶습니다. 그러나 OnShareTargetActivated 메서드에 있고 ObservableCollection에 항목을 추가하려면 클래스 형식과 COM 개체 사이에 InvalidCastException을 catch합니다.Windows 8에서 공유 대상이있는 InvalidCastException

다스 COM-OBJEKT 데 Typs "System.Collections.Specialized.NotifyCollectionChangedEventHandler" 을 kann nicht 서재에서 Klassentyp "System.Collections.Specialized.NotifyCollectionChangedEventHandler" umgewandelt werden. 계기판에 COM-Komponenten 이 그려져 있고, 그 중 아무거나가 입력되지 않았 으면, keine COM-Komponenten repräsentieren. 에있는 Umwandlung은 다음과 같습니다. COM-Komponente QueryInterface-Aufrufe for die IID der Schnittstelle unterstützt.

영어 버전 :

클래스 형 'System.Collections.Specialized.NotifyCollectionChangedEventHandler'에 유형 'System.Collections.Specialized.NotifyCollectionChangedEventHandler'의 COM 개체를 캐스팅 할 수 없습니다. COM 구성 요소를 나타내는 형식의 인스턴스는 COM 구성 요소를 나타내지 않는 형식으로 캐스팅 할 수 없습니다. 그러나 기본 COM 구성 요소가 인터페이스의 IID에 대한 QueryInterface 호출을 지원하는 한 인터페이스에 캐스팅 될 수 있습니다.

지금은 조금 혼란스러워하고이 동작을 올바르게 처리하는 방법을 모릅니다.

System.StubHelpers.StubHelpers.GetCOMIPFromRCW_WinRTDelegate (객체 objSrc, IntPtr입니다에서 : img

public class ViewModelLocator 
{ 
    /// <summary> 
    /// Initializes a new instance of the ViewModelLocator class. 
    /// </summary> 
    public ViewModelLocator() 
    { 
     ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 

     SimpleIoc.Default.Register<MainViewModel>(); 
     SimpleIoc.Default.Register<UserViewModel>(); 
     SimpleIoc.Default.Register<UriViewModel>(); 
    } 

    public MainViewModel Main 
    { 
     get 
     { 
      return ServiceLocator.Current.GetInstance<MainViewModel>(); 
     } 
    } 

    //... 
} 

스택 추적

ViewModelLocator

새로 만든 BitmapImage입니다

MainViewModel main1 = new ViewModelLocator().Main; 
MainViewModel main2 = new MainViewModel(); 
var conversation = new ConversationViewModel(); 
conversation.Messages.Add(new MessageViewModel { Image = img, Text = "Share" }); 
main1.Conversations.Add(conversation); // error InvalidCastException 
main2.Conversations.Add(conversation); // no error 

pCPCMD, IntPtr,ppTarget) System.Collections.ObjectModel.ObservableCollection 1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
at System.Collections.ObjectModel.ObservableCollection
1.InsertItem (INT32 인덱스, T 항목)에서
은 System.Collections에서 System.Collections.Specialized.NotifyCollectionChangedEventHandler.Invoke (객체 보낸 사람, NotifyCollectionChangedEventArgs 전자)에서
.ObjectModel.Collection`1.Add (T 항목) 대신 명시 적 캐스팅의

+1

희망이 없어도 괜찮습니다.동일한 예외 메시지의 영어 버전을 추가하고 질문에 스택 추적을 추가했습니다. 이걸 알아 냈어? –

+0

오류는 응용 프로그램의 호출 컨텍스트에 대한 것입니다. 두 객체의 유형은 같지만 하나는 com 객체 (공유)이고 다른 하나는 ".net"객체 (ViewModelLocaltor(). Main)입니다. 그런 문제에서 .. – Philipp

+0

나는 단지 같은 문제에 부딪쳤다. 누구든지 해결책을 찾았습니까? – mztan

답변

1

변환, 그것은 서비스 로케이터에 의해 반환 된 인스턴스처럼 소리 MainViewModel 대상이 아닌 "로"는, ​​해당 줄을 변경 사용

return ServiceLocator.Current.GetInstance() as MainViewModel; 

인스턴스가 다음이 null을 반환하는 MainviewModel없는 경우가 다르게 동작 할 수 있습니다,이 인스턴스가 서비스 로케이터에서 null을 반환 이유를 디버깅하는 데 도움이됩니다.