2012-09-07 15 views
15

私はWindows 8「Metro Styled Apps」、MVVM Lightを試しています。しかし、私がOnShareTargetActivatedメソッドに入っていてObservableCollectionにアイテムを追加したい場合は、クラスタイプとCOMオブジェクトの間にInvalidCastExceptionをキャッチします。Windows 8で共有ターゲットを持つInvalidCastException

ダスCOM-ObjektデTyps "System.Collections.Specialized.NotifyCollectionChangedEventHandler" カンNICHTデンでKlassentyp "System.Collections.Specialized.NotifyCollectionChangedEventHandler" umgewandelt werden。 COM-Komponentenの型式の型式は、型式の数値型ではなく、 keine COM-Komponentenrepräsentierenです。 には、Schnittstellen ist jedochmöglichには、のCOM-Komponente QueryInterface-Aufrufeを使用してください。 unterstützt。

英語版:

クラスタイプ 'System.Collections.Specialized.NotifyCollectionChangedEventHandler' にタイプ 'System.Collections.Specialized.NotifyCollectionChangedEventHandler' のCOMオブジェクトをキャストすることができません。 COMコンポーネントを表す型のインスタンスは、COMコンポーネントを表さない型にはキャストできません。基になるCOMコンポーネントがインターフェイスのIIDのQueryInterface呼び出しをサポートしている限り、インターフェイスにキャストできます。

今、私はちょっと混乱しており、この動作を正しく処理する方法がわかりません。

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

    //... 
} 

スタックトレースです

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 

: で

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

エラーはアプリケーションの呼び出しコンテキストに関するもので、2つのオブジェクトは同じタイプですが、1つはcomオブジェクト(共有)で、もう1つは ".net"オブジェクト(ViewModelLocaltor()。Main)そのような問題で。 – Philipp

+0

私はちょうど同じ問題に遭遇した。誰も解決策を見つけましたか? – mztan

答えて

1

変換は、それがサービス・ロケータによって返されたインスタンスのように聞こえるMainViewModelオブジェクトではない「と」、にその行を変更し使用

return ServiceLocator.Current.GetInstance() as MainViewModel; 

インスタンスは、それがnullを返しますMainviewModelでない場合には、異なった動作をする場合があり、これは、インスタンスがサービスロケータからnullを戻した理由をデバッグするのに役立ちます。

関連する問題