Windows 8上具有共享目标的InvalidCastException

Phi*_*ipp 15 .net c# mvvm-light windows-8 windows-runtime

我正在尝试使用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
Run Code Online (Sandbox Code Playgroud)

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>();
        }
    }

    //...
}
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪:

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

Jeg*_*gan 1

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

return ServiceLocator.Current.GetInstance() as MainViewModel;
Run Code Online (Sandbox Code Playgroud)

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