Как остановить запуск моего кода ViewModel в конструкторе?

Я разрабатываю сетевое приложение WPF с шаблоном MVVM, и кажется, что оно работает и подключается к серверам в конструкторе.

Я знаю о свойстве IsInDesignMode, но не знаю, как получить к нему доступ в ViewModel.


person Brian Ortiz    schedule 21.09.2010    source источник


Ответы (5)


Просто чтобы добавить к этим предложениям, вы, вероятно, захотите оптимизировать для производственного развертывания.

Если вам нужно проверить режим разработки в ViewModel, вы должны делать это только в режиме DEBUG, иначе выпущенная версия всегда будет выполнять ненужные проверки.
При разработке, если в режиме разработки вы можете выйти из метода ( или даже заглушить некоторые поддельные данные).

Поместите этот код в качестве первой строки вашего конструктора (или любого другого вызываемого кода):

С#:

#if DEBUG
    if (DesignerProperties.GetIsInDesignMode(new DependencyObject())) return;
#endif

ВБ:

#If DEBUG Then
    If DesignerProperties.GetIsInDesignMode(New DependencyObject()) Then Return
#End If
person KyleMit    schedule 23.01.2014

Я подумал, что добавлю к этому, поскольку я только что нашел что-то, что я заметил в VS2015, и это предлагает альтернативное решение. В дизайнере есть кнопка "Отключить код проекта".

Я предполагаю, что ваш ViewModel создается и делает что-то из вашего кода. Я знаю, что это ломает чистый MVVM, но я видел много людей, делающих такие вещи, как DataContext = new MyViewModel(); в конструкторе в коде позади.

Переключение этой кнопки должно решить эту проблему и помочь сохранить ваш код чище. Проверьте MSDN для получения дополнительной информации.

Вот изображение из документации MSDN, чтобы вы знали, как оно выглядит. Я уверен, что ссылка в конце концов порвется.

введите описание изображения здесь

Я заметил это в VS2015, но не уверен, в какой версии эта функция была добавлена.

В качестве примечания, это также удваивается как хороший способ перезагрузить конструктор. Хотя и медленно, когда я пытался. Ваш пробег может отличаться.

person Darren Hale    schedule 29.07.2016

Я использую следующий оператор для кода, который я могу выполнять только во время выполнения приложения и в противном случае вызвал бы исключение в конструкторе XAML.

      if (System.Windows.Application.Current.MainWindow != null)
person Jonathan Websdale    schedule 27.04.2011

Поместите источник данных времени разработки в свой XAML следующим образом:

<UserControl x:Class="Company.Product.View.MyView"
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:vm="clr-namespace:Company.Product.ViewModel.Design"
xmlns:design_vm="clr-namespace:Company.Product.ViewModel.Design"
mc:Ignorable="d" Name="MyView">
<UserControl.Resources>
    <ObjectDataProvider ObjectType="{x:Type design_vm:MyViewModel}" x:Key="DesignTime_DataSource" d:IsDataSource="True"/>
</UserControl.Resources>
<Grid d:DataContext="{StaticResource DesignTime_DataSource}">
....
</Grid>
</UserControl>

Пусть ваша модель представления времени разработки наследуется от модели представления времени выполнения, но смоделируйте данные в конструкторе. Возможно, вам также придется что-то сделать с моделью представления времени выполнения, чтобы модель представления времени разработки не запускала код доступа к данным.

person Guge    schedule 21.09.2010
comment
Похоже, что Visual Studio аварийно завершает работу, когда в ViewModel возникает необработанное исключение, когда это делается таким образом. - person Brian Ortiz; 22.09.2010
comment
Мой опыт показывает, что окно дизайна изящно падает, а не вся студия. - person Guge; 22.09.2010

Все зависит от того, как вы настроите привязку между представлением и моделью представления. Если он инициирован представлением в конструкторе (что кажется вероятным, учитывая симптомы), вы можете проверить IsInDesignMode оттуда. В противном случае вам нужно предоставить очень краткий обзор вашей архитектуры (или фреймворка, если вы его используете).

person Alex Paven    schedule 21.09.2010
comment
Все привязки выполняются в XAML, как в статье Джоша Смита о MVVM. - person Brian Ortiz; 21.09.2010