2012-09-07 81 views
15

我正在试验Windows 8“Metro风格的应用程序”,MVVM Light并希望创建一个共享目标 - 迄今为止这么好。但是,如果我在OnShareTargetActivated方法中,并且想要将项添加到ObservableCollection,那么我会捕获类类型和COM对象之间的InvalidCastException。InvalidCastException与Windows 8上的共享目标

达斯COM-OBJEKT DES Typs “System.Collections.Specialized.NotifyCollectionChangedEventHandler” 卡恩nicht在书房Klassentyp “System.Collections.Specialized.NotifyCollectionChangedEventHandler” umgewandelt werden。 Instanzen von Typen,die COM-Komponenten repräsentieren,könnennicht in andere Typen umgewandelt werden,die keine COM-Komponentenrepräsentieren。 Eine Umwandlung in Schnittstellen ist jedochmöglich,sofern die zugrunde liegende COM-Komponente QueryInterface-Aufrufefürdie IID der Schnittstelle unterstützt。

英文版:

无法转换类型 'System.Collections.Specialized.NotifyCollectionChangedEventHandler' 类类型 'System.Collections.Specialized.NotifyCollectionChangedEventHandler' 的COM对象。表示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 & ppTarget)
在 System.Collections.Specialized.NotifyCollectionChangedEventHandler.Invoke(对象 发件人,NotifyCollectionChangedEventArgs e)上System.Collections中
在System.Collections.ObjectModel.ObservableCollection 1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
at System.Collections.ObjectModel.ObservableCollection
1.InsertItem(的Int32 索引,T项) .ObjectModel.Collection`1.Add(T 项目)

+1

希望你不要介意。我已经为问题添加了相同异常消息和堆栈跟踪的英文版本。你有没有想过这个? –

+0

错误是关于应用程序的调用上下文 - 两个对象具有相同类型,但一个是com对象(share),另一个是“.net”对象(ViewModelLocaltor()。Main) - 将它们混合在一起result在这样的问题.. – Philipp

+0

我刚碰到相同的问题。有没有人找到解决方案? – mztan

回答

1

而是明确的铸造用“为”转换,这听起来像由服务定位器返回的实例不是MainViewModel对象,该行更改为

return ServiceLocator.Current.GetInstance() as MainViewModel; 

它可以表现不同,如果实例不是MainviewModel那么它将返回null,这将有助于您调试为什么实例从服务定位器返回null

相关问题