0

我正在使用 MVVM light 构建 Silverlight 5 应用程序,并且正在尝试实现 Navigation。

在 Laurent 在 Mix 11 演讲期间构建的 Silverlight 4 示例(针对 SL4)中,他使用以下代码检查 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(string key) 确实存在。

当我尝试使用这种新方法时,布尔检查总是返回 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 回答