从MVVM Light / Silverlight解决方案中删除定位器服务

时间:2015-06-03 13:36:52

标签: c# .net silverlight mvvm

首先,我是Silverlight中的一个初学者,而我之前从未使用过的MVVM Light中的更多。 我使用的是VS2013,我有一个使用MVVM Light的Silverlight解决方案(我不是这个解决方案的原始开发者)。 所以,我可能有8到10个视图和相同数量的视图模型是"链接"通过" ViewModelLocator"在定位器库中(如果我已经理解MVVM的工作原理)。

我的工作是从此解决方案中删除定位器服务,并直接使用视图后面的代码来建立"链接"使用ViewModel,因为此解决方案中并不真正需要定位器,因此他们决定将其删除。

我的第一个想法是"简单地说"复制(并进行必要的调整)定位器中与该视图后面的代码有关的视图中的代码,并删除在视图xaml中绑定定位器的datacontext。 但它不起作用,我在调试控制台中看到很多消息(但没有错误或警告),如:"错误System.Windows.Data:路径错误BindingExpression:property' User'找不到' Info.ViewModel.ViewModel_Content' .........

我想我应该错过一些东西,但我不知道是什么,也许是对改变的约束或类似的东西......就像我改变的东西不会影响解决方案,现在我看到更少"事情&# 34;我开始时在我的界面上。

您对此有何看法?删除定位器服务的正确步骤是什么?

非常感谢你的帮助和建议,我为我糟糕的英语道歉:p

编辑:

我还忘了说我已经编辑了app.xaml并删除了对ViewModelLocator的引用:

<vm:ViewModelLocator x:Key="Locator"/>

在这里,您可以看到ViewModelLocator.cs中的块代码示例(有7个或8个像这样,每个视图/ viewModel一个):

    private static ViewModel_Ask _Ask;

    public ViewModel_Ask Ask
    {
        get
        {
            return AskStatic;
        }
    }

    public static void CreateAsk()
    {
        if (_Ask == null)
        {
            _Ask = new ViewModel_Ask();
        }
    }

    public static void ClearAsk()
    {
        _Ask.Cleanup();
        _Ask = null;
    }

    public static ViewModel_Ask AskStatic
    {
        get
        {
            if (_Ask == null)
            {
                CreateAsk();
            }

            return _Ask;
        }
    }

编辑:

问题解决了!马克答案是对的,我终于解决了我的问题。不要忘记删除视图中的数据源,并在视图后面的每个代码中设置datacontext。谢谢!

1 个答案:

答案 0 :(得分:1)

  1. 从app.xaml中删除定位器引用。
  2. 在每个视图中,删除datacontext binding。
  3. 您提供的单例模式可以放入所需视图模型的每个代码中。
  4. 在后面的每个视图代码中,添加到构造函数(或加载的方法等):

    this.DataContext = Ask;

  5. (很明显,viewmodel类会因每个视图而异)

    如果我理解你的帖子,你已经完成了所有这些,但#4。