Невозможно создать экземпляр "ViewModelLocator" - PullRequest
2 голосов
/ 28 декабря 2011

Я отлично работал с MVVM Light над проектом Silverlight 4 для Windows Phone 7 в Visual Studio 2010 и Blend 4 в течение некоторого времени.Затем внезапно я получаю сообщение об ошибке «Не удается создать экземпляр« ViewModelLocator »» в VS 2010 и Blend.Не могу понять, почему это должно появиться сейчас.Любые идеи о том, как я могу отследить, изменилось ли что-то, чего я не заметил.Единственное изменение, которое я сделал, а затем вернул обратно, заключалось в добавлении «d:» перед выражением контекста данных в одном из пользовательских элементов управления.У меня была идея связывать в дизайне, но программно связывать с задержкой во время выполнения.

Я вижу, что другие опубликовали эту проблему, но ответы относятся к ошибке в Blend, которая, очевидно, была исправлена.Это также происходит в VS2010.

App.xaml выглядит как

<Application x:Class="BillSplitter2.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
         xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         mc:Ignorable="d"
         xmlns:vm="clr-namespace:BillSplitter2.ViewModel"
         xmlns:converters="clr-namespace:HardMediumSoft.WP7.Tools.Converters;assembly=HardMediumSoft.WP7.Tools">


<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Resources/ResourceDictionary1.xaml"/>
        </ResourceDictionary.MergedDictionaries>
        <!--Global View Model Locator-->
        <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True"/>
        <!--Localization String Library-->
        <local:LocalizedStrings xmlns:local="clr-namespace:BillSplitter2.Utilities"
                                x:Key="LocalizedStrings" />
        <!--Converters -->
        <converters:FloatConverter x:Key="FloatConverter" />
        <converters:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" />
        <converters:StringToBrush x:Key="StringToBrushConverter" />
    </ResourceDictionary>
</Application.Resources>


<Application.ApplicationLifetimeObjects>
    <!--Required object that handles lifetime events for the application-->
    <shell:PhoneApplicationService Launching="Application_Launching"
                                   Closing="Application_Closing"
                                   Activated="Application_Activated"
                                   Deactivated="Application_Deactivated" />
</Application.ApplicationLifetimeObjects>

Ответы [ 2 ]

2 голосов
/ 05 января 2012

Благодаря рекомендации, приведенной выше, я начал исследовать конструктор моей ViewModel. Хотя у меня не было ошибок, я обнаружил, что у belnd были проблемы со слушателями и обработчиками событий.

Я использовал

if (IsInDesignMode)
{
   //populate values here for blend
}
else
{
   //runtime initiation
}

для заполнения некоторых значений времени проектирования. Я бы инициировал значения в модели, установив их свойства. Это было нормально, пока я не начал добавлять более сложные процедуры обработки событий, основанные на изменениях свойств.

Чтобы исправить это и восстановить мою «смешиваемость», я сделал две вещи!

  1. Установите личные поля, а не свойства в разделе IsDesignMode. Это позволяет избежать событий PropertyChanged.
  2. Добавлено обнаружение IsInDesignMode в обработчиках событий, которые оставались проблемой и пропускали любое каскадное обновление.

Надеюсь, это поможет!

1 голос
/ 29 декабря 2011

Ранее на это отвечали . Убедитесь, что проблема не связана с ошибкой при создании экземпляра объекта ( конструктор и т. Д. )

...