15

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

Das COM-Objekt des Typs "System.Collections.Specialized.NotifyCollectionChangedEventHandler" は、クラス内の "System.Collections.Specialized.NotifyCollectionChangedEventHandler" umgewandelt werden を参照してください。Instanzen von Typen, die COM-Komponenten repräsentieren, können nicht in andere Typen umgewandelt werden, die keine COM-Komponenten repräsentieren. Eine Umwandlung in 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 はどこにありますか

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.Collections.Specialized.NotifyCollectionChangedEventHandler.Invoke (オブジェクトの送信者、 NotifyCollectionChangedEventArgs
e)
で System.Collections.ObjectModel.ObservableCollection 1.InsertItem (Int32 インデックス、 T アイテム) System.Collections.ObjectModel.Collection`1.Add(T アイテム) で1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
at System.Collections.ObjectModel.ObservableCollection

4

1 に答える 1

1

明示的なキャストの代わりに、「as」変換を使用します。サービス ロケーターによって返されたインスタンスがMainViewModelオブジェクトではないように思えます。その行を次のように変更します。

return ServiceLocator.Current.GetInstance() as MainViewModel;

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

于 2013-05-16T09:16:18.960 に答える