【问题标题】:InvalidCastException with share target on Windows 8InvalidCastException 与 Windows 8 上的共享目标
【发布时间】:2012-09-07 22:10:19
【问题描述】:

我正在尝试使用 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” 乌姆格万德尔特韦尔登Instanzen von Typen, die COM-Komponenten repräsentieren, können nicht in andere Typen umgewandelt werden, die keine COM-Komponenten repräsentieren。 Eine Umwandlung 在 Schnittstellen ist jedoch möglich, sofern die zugrunde liegende COM-Komponente QueryInterface-Aufrufe für die IID 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

视图模型定位器

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.ObjectModel.ObservableCollection1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
at System.Collections.ObjectModel.ObservableCollection
1.InsertItem(Int32 索引,T 项)在 System.Collections.ObjectModel.Collection`1.Add(T 项目)

【问题讨论】:

  • 希望你不介意。我在问题中添加了相同异常消息和堆栈跟踪的英文版本。你有想过这个吗?
  • 错误是关于应用程序的调用上下文 - 这两个对象具有相同的类型,但一个是 com 对象(share),另一个是“.net”对象(ViewModelLocaltor(). Main) - 将它们混合在一起会导致此类问题..
  • 我刚刚遇到了同样的问题。有人找到解决方案了吗?
  • 看看你是如何创建 img 对象的。
  • 你能从你的 ViewModelLocator 类中为“Main”属性发布代码

标签: c# windows-8 windows-runtime mvvm-light .net


【解决方案1】:

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

return ServiceLocator.Current.GetInstance() as MainViewModel;

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

【讨论】:

    猜你喜欢
    • 2012-04-14
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多