Имя ViewModelLocator не существует в пространстве имен

Я изучаю WPF с MVVM Light, и у меня проблема с моей портативной библиотекой классов. Я следую этому руководству: http://www.codeproject.com/Articles/536494/Portable-MVVM-Light-Move-Your-View-Models

Я создал библиотеку классов портала и WPF MVVM light 4.5 со ссылкой на MVVM Light. Я добавил ссылку на мой PCL в свой проект wpf. Поэтому в моем PCL я добавил папку ModelView и внутри моего ModelViewLocator

using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Ioc;
using Microsoft.Practices.ServiceLocation;
using EasyDevis.EasyDevisPCL.Model;
using EasyDevis.EasyDevisPCL.ViewModel.MainPage;

namespace EasyDevis.EasyDevisPCL.ViewModel
{
/// <summary>
/// This class contains static references to all the view models in the
/// application and provides an entry point for the bindings.
/// <para>
/// See http://www.galasoft.ch/mvvm
/// </para>
/// </summary>
public class ViewModelLocator
{
    static ViewModelLocator()
    {
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
        SimpleIoc.Default.Register<MainPageViewModel>();
    }

    /// <summary>
    /// Gets the Main property.
    /// </summary>
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",
        "CA1822:MarkMembersAsStatic",
        Justification = "This non-static member is needed for data binding purposes.")]
    public MainPageViewModel MainPageViewModel
    {
        get
        {
            return ServiceLocator.Current.GetInstance<MainPageViewModel>();
        }
    }

    /// <summary>
    /// Cleans up all the resources.
    /// </summary>
    public static void Cleanup()
    {
    }
}
}

проблема приходит в мое приложение.xaml и пространство имен верны, потому что intelisense предлагает мне путь.

<Application x:Class="EasyDevis.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:vm="clr-namespace:EasyDevis.EasyDevisPCL.ViewModel"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         StartupUri="Content/MainPage/View/MainPageView.xaml"
         mc:Ignorable="d">

    <Application.Resources>
        <!--i've the error on this line-->
        <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
    </Application.Resources> 

</Application>

у вас есть представление о том, что я сделал неправильно?

3 ответов


код ViewModelLocator и Application проживает в другом проекте. Следовательно, сборки разные, поэтому вам нужно предоставить имя сборки вместе с именем пространства имен в определении XAML.

xmlns:vm="clr-namespace:EasyDevis.EasyDevisPCL.ViewModel;assembly=AssemblyName"

откройте свойства вашего проекта PCL и перейдите на вкладку application, вы увидите AssemblyName туда. Замените это имя сборки на AssemblyName в XAML.


Я решил это, сделав активную платформу решения x86 в configuration manager.

ранее я делал с Active Solution Platform, установленной на "любой процессор", и project platform, установленной на "x86". И я получал ошибку:

имя "ViewModelLocator" не существует в пространстве имен xxxxx...

затем я изменил свою активную платформу решения на x86, и ошибка исчезла! Итак, резюме-это: как платформы активного решения и проекта должны быть одинаковыми.

(Я создавал приложение windows phone 8.1, используя MVVMLight и запускал его на эмуляторе).


опоздал на вечеринку, но я обнаружил ViewModelLocator.cs имел базовый пакет, на который он ссылался, перемещался и предотвращал его создание (и, в свою очередь, вызывал эту ошибку, поскольку он "не существовал")

Итак, в ViewModel / ViewModelLocator.cs, change

using Microsoft.Practices.ServiceLocation;

to

using CommonServiceLocator;