Ответ 1
DependencyObject dep = new DependencyObject();
if (DesignerProperties.GetIsInDesignMode(dep))
{
...
}
Я разрабатываю сетевое приложение WPF с шаблоном MVVM и кажется, что он работает и подключается к серверам в дизайнере.
Я знаю о свойстве IsInDesignMode, но я не уверен, как получить доступ к нему в ViewModel.
DependencyObject dep = new DependencyObject();
if (DesignerProperties.GetIsInDesignMode(dep))
{
...
}
Просто чтобы добавить к этим предложениям, вы, вероятно, хотите оптимизировать развертывание продукции.
Если вам нужно проверить режим разработки в ViewModel, вы должны сделать это только в режиме DEBUG
, иначе выпущенная версия всегда будет выполнять ненужные проверки.
При разработке, если в режиме разработки вы можете выйти из метода (или даже заглушить некоторые поддельные данные).
Поместите этот код в первую строку вашего конструктора (или любого другого кода):
С#:
#if DEBUG
if (DesignerProperties.GetIsInDesignMode(new DependencyObject())) return;
#endif
VB
#If DEBUG Then
If DesignerProperties.GetIsInDesignMode(New DependencyObject()) Then Return
#End If
Я думал, что добавлю к этому, поскольку я только что искал то, что я увидел в VS2015, и он предлагает альтернативное решение. В дизайнере есть кнопка "Отключить код проекта".
Я делаю предположение, что ваш ViewModel
создается и обрабатывает ваш код позади. Я знаю, что это разрывает чистый MVVM, но я видел, как много людей делали такие вещи, как DataContext = new MyViewModel();
внутри конструктора в коде.
Переключение этой кнопки должно решить эту проблему и поможет сохранить код чище. Оформить заказ MSDN для получения дополнительной информации.
Вот изображение из документации MSDN, чтобы вы знали, как это выглядит. В любом случае, я уверен, что связь сломается.
Я заметил это в VS2015, но не знаю, какое издание добавили эту функцию.
В качестве побочного примечания он также удваивается как хороший способ перезагрузить конструктор. Хотя медленный, когда я пытался. Ваше перемещение может отличаться.
Я использую следующий оператор вокруг кода, который я могу выполнить только во время выполнения приложения и в противном случае вывел бы исключение в конструкторе XAML.
if (System.Windows.Application.Current.MainWindow != null)
Поместите источник данных времени разработки в свой 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 времени наследования наследуется от модели представления времени выполнения, но макет данных в конструкторе. Возможно, вам также придется что-то сделать для модели представления времени выполнения, поэтому модель времени просмотра проекта не запускает код доступа к данным.
Все зависит от того, как вы установили привязку между представлением и моделью представления. Если он инициируется представлением в конструкторе (что кажется вероятным с учетом симптомов), вы можете проверить IsInDesignMode оттуда. В противном случае вам нужно предоставить очень быстрый обзор вашей архитектуры (или рамки, если вы используете какой-либо).