Windows 8上具有共享目标的InvalidCastException

我正在尝试使用Windows 8“Metro Styled Apps”,MVVM Light,并希望创建一个共享目标 – 到目前为止一切顺利。 但是如果我在OnShareTargetActivated方法中并且想要将项添加到ObservableCollection,我会在类类型和COM对象之间捕获InvalidCastException。

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-Komponentenrepräsentieren,könnennichtin andere Typen umgewandelt werden,die keine COM-Komponentenrepräsentieren。 Echn Umwandlung in Schnittstellen istjedochmöglich,sofern die zugrunde liegende COM-Komponente QueryInterface-AufrufefürdieIID derSchnittstelleunterstützt。

英文版:

无法将类型为“System.Collections.Specialized.NotifyCollectionChangedEventHandler”的COM对象强制转换为类类型“System.Collections.Specialized.NotifyCollectionChangedEventHandler”。 表示COM组件的类型实例不能转换为不代表COM组件的类型; 但是只要底层的COM组件支持对接口的IID的QueryInterface调用,它们就可以转换为接口。

现在我有点困惑,不知道如何正确处理这种行为。

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 

其中img是一个新创建的BitmapImage

ViewModelLocator

 public class ViewModelLocator { ///  /// Initializes a new instance of the ViewModelLocator class. ///  public ViewModelLocator() { ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); SimpleIoc.Default.Register(); SimpleIoc.Default.Register(); SimpleIoc.Default.Register(); } public MainViewModel Main { get { return ServiceLocator.Current.GetInstance(); } } //... } 

堆栈跟踪:

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

而不是显式转换使用“as”转换,听起来像服务定位器返回的实例不是MainViewModel对象,将该行更改为

 return ServiceLocator.Current.GetInstance() as MainViewModel; 

它的行为可能不同,如果实例不是MainviewModel那么它将返回null ,这将帮助您调试实例从服务定位器返回null原因。