2012-09-07 11 views
15

Ich experimentiere mit Windows 8 "Metro Styled Apps", MVVM Light und möchte ein Share-Ziel erstellen - so weit so gut. Aber wenn ich in der OnShareTargetActivated-Methode bin und ein Objekt zu einer ObservableCollection hinzufügen möchte, erhalte ich eine InvalidCastException zwischen Klassentyp und COM-Objekt.InvalidCastException mit Freigabeziel unter Windows 8

Das COM-Objekt des typs "System.Collections.Specialized.NotifyCollectionChangedEventHandler" can not in den Klassentyp "System.Collections.Specialized.NotifyCollectionChangedEventHandler" umgewandelt Werden. Die COM-Komponenten representieren, können in die keine COM-Komponenten represensen. Eine Umwandlung in Schnittstellen ist möglich, so dass die zugrunde liegende COM-Komponente QueryInterface-Aufrufe für die IID der Schnittstelle unterstützt.

englische Version:

kann nicht COM-Objekt des Typs 'System.Collections.Specialized.NotifyCollectionChangedEventHandler' auf Klassentyp 'System.Collections.Specialized.NotifyCollectionChangedEventHandler' werfen. Instanzen von Typen, die COM-Komponenten darstellen, können nicht in Typen umgewandelt werden, die keine COM-Komponenten darstellen. Sie können jedoch in Schnittstellen umgewandelt werden, solange die zugrunde liegende COM-Komponente QueryInterface-Aufrufe für die IID der Schnittstelle unterstützt.

Jetzt bin ich ein bisschen verwirrt und weiß nicht, wie man dieses Verhalten richtig behandelt.

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 

Wo img ist ein neu erstelltes Bitmap

ViewModelLocator

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

    //... 
} 

Stack Trace:

bei System.StubHelpers.StubHelpers.GetCOMIPFromRCW_WinRTDelegate (Object objSrc, IntPtr pCPCMD, IntPtr & ppTarget)
bei System.Collections.Specialized.NotifyCollectionChangedEventHandler.Invoke (Object sender, NotifyCollectionChangedEventArgs e)
bei System.Collections.ObjectModel.ObservableCollection 1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
at System.Collections.ObjectModel.ObservableCollection
1.InsertItem (Int32 Index, T Punkt) bei System.Collections .ObjectModel.Collection`1.Add (T Artikel)

+1

Ich hoffe, es macht Ihnen nichts aus.Ich habe die englische Version der gleichen Ausnahmebedingungsnachricht und Stack-Ablaufverfolgung zu der Frage hinzugefügt. Hast du das jemals herausgefunden? –

+0

Der Fehler betrifft den aufrufenden Kontext der Anwendung - die beiden Objekte haben denselben Typ, aber einer ist ein com-Objekt (share) und der andere ein ".net" -Objekt (ViewModelLocaltor(). Main) - mixim sie zusammen in solchen Problemen .. – Philipp

+0

Ich lief gerade in das gleiche Problem. Hat jemand eine Lösung gefunden? – mztan

Antwort

1

statt explizite Umwandlung verwenden, die „als“ Umwandlung, wie es der Instanz durch den Service Locator zurück ertönt kein MainViewModel Objekt, diese Linie zu ändern,

return ServiceLocator.Current.GetInstance() as MainViewModel; 

Es kann sich anders verhalten, wenn die Instanz kein MainviewModel ist, dann wird es null zurückkehren, wird diese Ihnen helfen, debuggen, warum die Instanz null vom Service Locator zurückgegeben.