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.ObservableCollection1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
1.InsertItem (Int32 Index, T Punkt) bei System.Collections .ObjectModel.Collection`1.Add (T Artikel)
at System.Collections.ObjectModel.ObservableCollection
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? –
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
Ich lief gerade in das gleiche Problem. Hat jemand eine Lösung gefunden? – mztan