2012-09-07 15 views
15

Estoy experimentando con Windows 8 "Metro Styled Apps", MVVM Light y quiero crear un objetivo compartido, hasta ahora, todo bien. Pero si estoy en el método OnShareTargetActivated y quiero agregar un elemento a un ObservableCollection, atrapo una InvalidCastException entre el tipo de clase y el objeto COM.InvalidCastException con destino compartido en Windows 8

Das COM-Objeto des Typs "System.Collections.Specialized.NotifyCollectionChangedEventHandler" kann nicht en el foso 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 en Schnittstellen ist jedoch möglich, sofern die zugrunde liegende COM-Komponente QueryInterface-Aufrufe für die IID der Schnittstelle unterstützt.

Inglés Versión:

No se puede convertir objeto COM de tipo 'System.Collections.Specialized.NotifyCollectionChangedEventHandler' al tipo de clase 'System.Collections.Specialized.NotifyCollectionChangedEventHandler'. Las instancias de tipos que representan componentes COM no se pueden convertir a tipos que no representan componentes COM; sin embargo, se pueden convertir en interfaces siempre que el componente COM subyacente sea compatible con las llamadas a QueryInterface para el IID de la interfaz.

Ahora estoy un poco confundido y no sé cómo manejar este comportamiento correctamente.

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 

Dónde img es una BitmapImage recién creado

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

    //... 
} 

Seguimiento de la pila:

en System.StubHelpers.StubHelpers.GetCOMIPFromRCW_WinRTDelegate (Objeto objSrc, IntPtr pCPCMD, IntPtr & ppTarget)
en System.Collections.Specialized.NotifyCollectionChangedEventHandler.Invoke (Object remitente, NotifyCollectionChangedEventArgs e)
en System.Collections.ObjectModel.ObservableCollection 1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
at System.Collections.ObjectModel.ObservableCollection
1.InsertItem (Int32 índice, T elemento) en System.Collections .ObjectModel.Collection`1.Add (T artículo)

+1

Espero que no te importe.Agregué la versión en inglés del mismo mensaje de excepción y el seguimiento de la pila a la pregunta. ¿Alguna vez resolviste esto? –

+0

El error es sobre el contexto de llamada de la aplicación: los dos objetos tienen el mismo tipo, pero uno es un objeto com (compartir) y el otro un objeto ".net" (ViewModelLocaltor(). Main) - mixim juntos resultados en tales problemas ... – Philipp

+0

Acabo de encontrarme con el mismo problema. ¿Alguien ha encontrado una resolución? – mztan

Respuesta

1

en lugar de conversión explícita utilizar el "como" conversión, suena como la instancia devuelta por el localizador de servicio no es un objeto MainViewModel, cambiar esa línea para

return ServiceLocator.Current.GetInstance() as MainViewModel; 

Se puede comportarse de manera diferente, si la instancia no es un MainviewModel luego volverá null, esto ayudará a depurar la razón por la instancia volvió null del localizador de servicios.