2012-09-07 14 views
15

Sto sperimentando con Windows 8 "Metro Styled Apps", MVVM Light e voglio creare un obiettivo di condivisione, finora così buono. Ma se sono nel metodo OnShareTargetActivated e voglio aggiungere un elemento a ObservableCollection, rilevo un InvalidCastException tra il tipo di classe e l'oggetto COM.InvalidCastException con destinazione condivisa su Windows 8

Das COM-Objekt des Typs "System.Collections.Specialized.NotifyCollectionChangedEventHandler" kann nicht in den Klassentyp "System.Collections.Specialized.NotifyCollectionChangedEventHandler" umgewandelt werden. Instanzen von Typen, die COM-Komponenten repräsentieren, können nicht in andere Typen umgewandelt werden, die keine COM-Komponenten repräsentieren. Eine Umwandlung in Schnittstellen ist jedoch möglich, sofern die zugrunde liegende COM-Komponente QueryInterface-Aufrufe für die IID der Schnittstelle unterstützt.

versione inglese:

Impossibile eseguire il cast di oggetti COM di tipo 'System.Collections.Specialized.NotifyCollectionChangedEventHandler' al tipo di classe 'System.Collections.Specialized.NotifyCollectionChangedEventHandler'. Le istanze di tipi che rappresentano componenti COM non possono essere convertite in tipi che non rappresentano componenti COM; tuttavia possono essere trasmessi alle interfacce purché il componente COM sottostante supporti chiamate QueryInterface per l'IID dell'interfaccia.

Ora Im un po 'confuso e non so come gestire correttamente questo comportamento.

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 

Dove img è un BitmapImage appena creato

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

    //... 
} 

dello stack:

a System.StubHelpers.StubHelpers.GetCOMIPFromRCW_WinRTDelegate (Object objSrc, IntPtr pCPCMD, IntPtr & ppTarget)
a System.Collections.Specialized.NotifyCollectionChangedEventHandler.Invoke (Object mittente, NotifyCollectionChangedEventArgs e)
a System.Collections.ObjectModel.ObservableCollection 1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
at System.Collections.ObjectModel.ObservableCollection
1.InsertItem (Int32 index, T item) a System.Collections .ObjectModel.Collection`1.Add (T voce)

+1

Spero non ti dispiaccia.Ho aggiunto la versione inglese dello stesso messaggio di eccezione e lo stack trace alla domanda. L'hai mai capito? –

+0

L'errore riguarda il contesto di chiamata dell'applicazione - i due oggetti hanno lo stesso tipo, ma uno è un oggetto com (condivisione) e l'altro un oggetto ".net" (ViewModelLocaltor(). Main) - mixim insieme i risultati in tali problemi .. – Philipp

+0

Ho appena avuto lo stesso problema. Qualcuno ha trovato una soluzione? – mztan

risposta

1

Invece di fusione esplicita per l'uso del "come" conversione, suona come l'istanza restituito dal localizzatore servizio non è un oggetto MainViewModel, cambiare quella linea a

return ServiceLocator.Current.GetInstance() as MainViewModel; 

Può comportarsi in modo diverso, se l'istanza non è un MainviewModel allora tornerà null, questo vi aiuterà a eseguire il debug perché l'istanza restituita null dal localizzatore di servizio.

Problemi correlati