我正在尝试使用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,死于COM-Komponenten repräsentieren,könnenichtin andere Typen umgewandelt werden,die keine COM-Komponentenrepräsentieren。 Eine Umwandlung in Schnittstellen istjedochmöglich,sofern die zugrunde liegende COM-Komponente QueryInterface-AufrufefürdieIID der Schnittstelle unterstü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
{
/// <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>();
}
}
//...
}
堆栈追踪:
在 System.StubHelpers.StubHelpers.GetCOMIPFromRCW_WinRTDelegate(对象 objSrc,IntPtr pCPCMD,IntPtr&amp; ppTarget)
在 System.Collections.Specialized.NotifyCollectionChangedEventHandler.Invoke(对象 sender,NotifyCollectionChangedEventArgs e)
at System.Collections.ObjectModel.ObservableCollection1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
1.InsertItem(Int32 索引,T项)在System.Collections.ObjectModel.Collection`1.Add(T 项)
at System.Collections.ObjectModel.ObservableCollection
答案 0 :(得分:1)
而不是显式强制转换使用“as”转换,听起来服务定位器返回的实例不是MainViewModel
对象,将该行更改为
return ServiceLocator.Current.GetInstance() as MainViewModel;
它可能表现不同,如果实例不是MainviewModel
,那么它将返回null
,这将帮助您调试实例从服务定位器返回null
的原因。