我正在尝试使用Windows 8“Metro风格的应用程序”,MVVM Light,并希望创建一个共享目标-到目前为止非常好。但是,如果我处于OnShareTargetActivated方法中,并且想向ObservableCollection中添加一个项目,则会在类类型和COM对象之间捕获InvalidCastException。



英文版:



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

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

    //...
}

堆栈跟踪:

最佳答案

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

return ServiceLocator.Current.GetInstance() as MainViewModel;

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

09-08 10:02