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

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

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

Ответы

Ответ 1

DependencyObject dep = new DependencyObject();
if (DesignerProperties.GetIsInDesignMode(dep))
{
    ...
}

Ответ 2

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

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

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

С#:

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

VB

#If DEBUG Then
    If DesignerProperties.GetIsInDesignMode(New DependencyObject()) Then Return
#End If

Ответ 3

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

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

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

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

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

Я заметил это в VS2015, но не знаю, какое издание добавили эту функцию.

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

Ответ 4

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

      if (System.Windows.Application.Current.MainWindow != null)

Ответ 5

Поместите источник данных времени разработки в свой 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>

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

Ответ 6

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