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))
ここで何が欠けていますか?どんな助けでも素晴らしいでしょう!
クリス