Я разрабатываю сетевое приложение WPF с шаблоном MVVM, и кажется, что оно работает и подключается к серверам в конструкторе.
Я знаю о свойстве IsInDesignMode, но не знаю, как получить к нему доступ в ViewModel.
Я разрабатываю сетевое приложение WPF с шаблоном MVVM, и кажется, что оно работает и подключается к серверам в конструкторе.
Я знаю о свойстве IsInDesignMode, но не знаю, как получить к нему доступ в ViewModel.
Просто чтобы добавить к этим предложениям, вы, вероятно, захотите оптимизировать для производственного развертывания.
Если вам нужно проверить режим разработки в ViewModel, вы должны делать это только в режиме DEBUG
, иначе выпущенная версия всегда будет выполнять ненужные проверки.
При разработке, если в режиме разработки вы можете выйти из метода ( или даже заглушить некоторые поддельные данные).
Поместите этот код в качестве первой строки вашего конструктора (или любого другого вызываемого кода):
С#:
#if DEBUG
if (DesignerProperties.GetIsInDesignMode(new DependencyObject())) return;
#endif
ВБ:
#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>
Пусть ваша модель представления времени разработки наследуется от модели представления времени выполнения, но смоделируйте данные в конструкторе. Возможно, вам также придется что-то сделать с моделью представления времени выполнения, чтобы модель представления времени разработки не запускала код доступа к данным.
Все зависит от того, как вы настроите привязку между представлением и моделью представления. Если он инициирован представлением в конструкторе (что кажется вероятным, учитывая симптомы), вы можете проверить IsInDesignMode оттуда. В противном случае вам нужно предоставить очень краткий обзор вашей архитектуры (или фреймворка, если вы его используете).