我正在使用MVVM灯构建Silverlight 5应用程序,并且我正在尝试实现Navigation。
在Laurent在他的Mix 11谈话(针对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,结果导航失败(我得到“Item Not Found”消息框)。
我如何重写违规行的示例如下
if (!SimpleIoc.Default.ContainsCreated<NewsItemViewModel>(itemUrl))
我在这里想念的是什么?任何帮助都会很棒!
克里斯
答案 0 :(得分:2)
如何使用
SimpleIoc.Default.IsRegistered<NewsItemViewModel>(itemUrl)
我一直在使用GetInstance(key)创建它,如果尚未创建它,但它首先需要注册,以上将确认。
虽然你可能想也可能不想使用密钥 - 因为它会检查类型和密钥组合,但我认为只要
SimpleIoc.Default.IsRegistered<NewsItemViewModel>()
返回true,然后您应该能够将GetInstance与键
一起使用