DesignInstance не работает в VS2012

Я просто потратил несколько часов на проблему при использовании VS2012, WPF 4.5 и данных времени разработки, в частности, атрибута DesignInstance.

Цель. Я хотел иметь поддержку данных времени разработки в моем проекте WPF (на основе MVVM), как в VS2012, так и в Blend, и я не мог на всю жизнь сделать подход MVVMLight работать последовательно.

Поэтому я попытался перейти на "просто", используя встроенную поддержку данных времени разработки, используя расширение разметки, поставляемое с Blend.

Проблема. Рассмотрим следующий код:

<Window x:Class="Nova.View.AlertsView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:local="clr-namespace:Nova.View"
        xmlns:vm="clr-namespace:Nova.ViewModel"
        mc:Ignorable="d"
        DataContext="{Binding Alerts, Source={StaticResource Locator}}" 
        d:DataContext="{d:DesignInstance vm:DesignAlertsViewModel, IsDesignTimeCreatable=True}"
... />

Оба отчета VS2012 и Blend "имя DesignAlertsViewModel не существует в пространстве имен clr-names пространства имен: Nova.ViewModel", хотя intellisense разрешает его просто отлично, и вы проверили тысячу раз, что пространство имен и имя класса оба правильный.

Ответ 1

Я столкнулся с этой ошибкой сам в VS2013, затем нашел этот вопрос. После поиска больше я нашел ответ, который помог мне решить его.

вместо

d:DataContext="{d:DesignInstance vm:DesignAlertsViewModel, IsDesignTimeCreatable=True}"

использование

d:DataContext="{d:DesignInstance d:Type=vm:DesignAlertsViewModel, IsDesignTimeCreatable=True}"

Я использовал "... d: DesignInstance Type = vm:..." и отображает ту же ошибку, описанную выше. Как только я добавлю "d:", все работает.

Вот нить, которую я нашел, которая помогла.

fooobar.com/questions/378230/...

Ответ 2

Временное решение. Убедитесь, что класс данных времени разработки находится в том же пространстве имен, что и сам вид. Как только я переместил свой DesignAlertsViewModel в пространство имен View, оба конструктора VS2012 и Blend немедленно начали работать с данными времени разработки.

Обновить. Это обходной путь до тех пор, пока я не разойдусь с деталями. Однако, в моем случае, это единственный способ обеспечить постоянную работу данных времени разработки. Конечно, если вы спуститесь по этому маршруту, вы измените имена классов, поскольку, очевидно, DesignAlertsViewModel больше не является моделью представления. Теперь это просто POCO, содержащий данные о времени разработки. Поэтому, возможно, AlertsDesignData будет лучшим именем. Я не слишком доволен тем фактом, что данные моего времени разработки находятся под моим пространством имен View View, но он работает.

Я также рекомендую вам взглянуть на статью Лорана из MSDN Magazine, апрель 2013 г.. Мне нравится этот подход, поскольку он использует шаблон MVVM намного больше: служба данных/поставщик данных времени разработки вводится через IOC, поэтому ваши модели просмотра получат "упражнение" даже во время разработки.

Обновление 2. Проведя еще 4 часа на этом, я думаю, что жюри все еще не работает, какой подход лучше: нужно ли идти с помощью простых классов данных POCO или подхода MVVMLight, используя МОК для служб данных времени разработки? Первое простое и требует меньше кода, последнее более верно для подхода MVVM и в некоторой степени использует реальные модели представления и может выявить некоторые ошибки на этом пути.

Кроме того, мне пришлось перезапустить VS пару раз во время моего рефакторинга в подход MVVMLight. Данные времени разработки просто исчезли и вернулись после перезапуска VS. Тем не менее, сейчас это кажется достаточно стабильным, и я не могу этого больше определить.

Ответ 3

Проверьте, установлено ли значение "Платформа цели" в вашей конфигурации сборки " AnyCPU". У меня установлено значение " x64", поэтому дизайнер жаловался на отсутствующий тип.

VS работает в 32 бит, поэтому, возможно, есть проблема с выполнением кода из 64-битных сборок.

Я нашел решение при попытке открыть свой UserControl в "Blend for Visual Studio". Это показало мне чистое исключение.

P.S.: После использования принятого ответа: "d: Тип = vm: DesignAlertsViewModel" вместо "vm: DesignAlertsViewModel" мой элемент управления был виден, но никаких данных примера не было показано.

Ответ 4

Я обнаружил, что DesignInstance не работает в моих проектах .NET 3.5 и .NET 4.0, тогда как он работает в проекте > =.NET 4.5 (проекты одинаковы, они используют одни и те же файлы, используя ссылки).