MVVMlight没有将ViewModels添加到Silverlight 5中的SimpleIoc

时间:2012-09-04 15:50:17

标签: c# silverlight mvvm-light

我正在使用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))

我在这里想念的是什么?任何帮助都会很棒!

克里斯

1 个答案:

答案 0 :(得分:2)

如何使用

SimpleIoc.Default.IsRegistered<NewsItemViewModel>(itemUrl)

我一直在使用GetInstance(key)创建它,如果尚未创建它,但它首先需要注册,以上将确认。

虽然你可能想也可能不想使用密钥 - 因为它会检查类型和密钥组合,但我认为只要

SimpleIoc.Default.IsRegistered<NewsItemViewModel>()

返回true,然后您应该能够将GetInstance与键

一起使用