Как мне остановить мой код ViewModel от запуска в конструкторе? - PullRequest
17 голосов
/ 21 сентября 2010

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

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

Ответы [ 6 ]

30 голосов
/ 21 сентября 2010
DependencyObject dep = new DependencyObject();
if (DesignerProperties.GetIsInDesignMode(dep))
{
    ...
}
22 голосов
/ 23 января 2014

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

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

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

C # :

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

VB

#If DEBUG Then
    If DesignerProperties.GetIsInDesignMode(New DependencyObject()) Then Return
#End If
8 голосов
/ 29 июля 2016

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

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

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

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

enter image description here

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

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

4 голосов
/ 27 апреля 2011

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

      if (System.Windows.Application.Current.MainWindow != null)
3 голосов
/ 21 сентября 2010

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

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

1 голос
/ 21 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...