2010-07-21 1 views
0

Довольно часто я создам WPF UserControl с декларативной DataContext:Как заставить Visual Studio 2010 игнорировать WPF XAML, объявленный DataContext во время разработки?

<UserControl...> 
    <UserControl.DataContext> 
     <local:SomeModel x:Name="Model" /> 
    </UserControl.DataContext> 
</UserControl> 

В режиме разработки, Visual Studio будет пытаться создать экземпляр DataContext. Однако, когда DataContext тянет данные из файла конфигурации Visual Studio 2010 будет сгенерировано сообщение об ошибке, такие как:

Невозможно создать экземпляр «SomeModel».

При возникновении ошибки время опыта проектирования мало или вообще не имеет значения. Если я прокомментирую DataContext, тогда режим разработки Visual Studio 2010 работает так, как ожидалось, без DataContext.

Есть ли способ, чтобы Visual Studio игнорировала объявленный XAML DataContext во время разработки?

+0

Вы обнаружили чистый способ XAML, чтобы сделать это с 2010 года? – Olwaro

+0

Не существует чистого метода XAML; проблема заключается в том, что дизайнер пытается создать экземпляр модели. И если есть зависимости, необходимые для создания Модели, то создание экземпляра не будет выполнено. –

ответ

1

Не уверен, что я полностью понимаю, но я использую этот метод расширения для обнаружения, когда дизайнер работает мой код:

public static class Extensions 
{ 
    public static bool IsDesigner(this Process process) 
    { 
     if (process.MainModule != null) 
      return (process.MainModule.ModuleName.Contains("devenv.exe")); 

     return false; 
    } 
} 
+0

Расширение является хорошим обходом. Я хотел бы оставить вопрос открытым некоторое время, чтобы узнать, есть ли у кого чистая работа XAML. Благодаря! –

+0

Что делать, если ваш дизайнер не является devenv.exe? ... Например, Blend или другие инструменты редактирования XAML. Я думаю, что ответ ниже безопаснее. –

4

Override (или скрыть с «новым») контекстом вы данные и использовать системы .ComponentModel.DesignerProperties.GetIsInDesignMode(), чтобы вернуть соответствующий контекст.

Для получения бонусных очков заверните условный разрыв в предпроцессорных директивах и/или используйте условный условный атрибут(), чтобы этот дополнительный шум не попадал в производственную среду.

+0

Не могли бы вы добавить пример этого? – SteveCav

+0

@ SteveCar- в конструкторе VM: if (DesignerProperties.GetIsInDesignMode (новый DependencyObject())) { return; } – RichardOD

Смежные вопросы