0

MVVMライトを使用してSilverlight5アプリケーションを構築しており、ナビゲーションを実装しようとしています。

LaurentがMix11トーク(SL4を対象)中に作成したSilverlight 4サンプルでは、​​次のコードを使用して、SimpleIOCコンテナーに適切なViewModelが含まれているかどうかを確認し、存在しない場合は作成します。次に、ナビゲーションサービスは上記のViewModelを使用して呼び出されます。

if (!SimpleIoc.Default.Contains<NewsItemViewModel>(item.Link.ToString()))
{
    SimpleIoc.Default.Register(
    () => new NewsItemViewModel
    {
       Model = item
                },
       item.Link.ToString());
    }

        _navigationService.NavigateTo(
            new Uri(
                string.Format(ViewModelLocator.NewsItemUrl, item.Link),
                UriKind.Relative)); 

次に、NewsItemViewのOnNavigatedToメソッドで次のコードが実行され、NewsItemViewModelが存在するかどうか(作成されたばかりの場合は存在するはずです)がチェックされ、コンテナーからプルされます。

if (DataContext == null)
{
    var url = e.Uri.ToString();
    var itemUrl = url.Substring(url.IndexOf("?") + 1);

    if (!SimpleIoc.Default.Contains<NewsItemViewModel>(itemUrl))
    {
        MessageBox.Show("Item not found");
        return;
    }

    var vm = SimpleIoc.Default.GetInstance<NewsItemViewModel>(itemUrl);
    DataContext = vm;
}

Silverlight 5で同じことを実行しようとすると(プロジェクトのほぼ正確な移植を実行)、SimpleIoc.Default.Containsメソッドは存在しませんが、同様のContainsCreated(文字列キー)は存在します。

この新しいメソッドを使用しようとすると、boolチェックは常にfalseを返し、その結果、ナビゲーションは失敗します(「アイテムが見つかりません」というメッセージボックスが表示されます)。

問題のある行を書き直した例を以下に示します。

if (!SimpleIoc.Default.ContainsCreated<NewsItemViewModel>(itemUrl))

ここで何が欠けていますか?どんな助けでも素晴らしいでしょう!

クリス

4

1 に答える 1

2

使ってみてはどうですか

SimpleIoc.Default.IsRegistered<NewsItemViewModel>(itemUrl)

まだ作成されていない場合は作成する GetInstance(key) だけを使用していますが、最初に登録する必要があります。これは上記で確認できます。

キーを使用したい場合と使用しない場合がありますが、それはタイプとキーの組み合わせをチェックするためですが、

SimpleIoc.Default.IsRegistered<NewsItemViewModel>()

true を返す場合、キーで GetInstance を使用できるはずです

于 2012-09-04T15:56:08.780 に答える