wpf mvvm designer

wpf - ¿Cómo impido que mi código de ViewModel se ejecute en el diseñador?



mvvm designer (6)

Estoy desarrollando una aplicación WPF en red con el patrón MVVM y parece que se está ejecutando y conectándose a los servidores del diseñador.

Sé sobre la propiedad IsInDesignMode, pero no estoy seguro de cómo acceder a ella en un ViewModel.


Coloque una fuente de datos de tiempo de diseño en su XAML de esta manera:

<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>

Deje que su modelo de vista de tiempo de diseño herede del modelo de vista de tiempo de ejecución, pero simule los datos en el constructor. También es posible que deba hacer algo en su modelo de vista de tiempo de ejecución para que el modelo de vista en tiempo de diseño no ejecute el código de acceso a datos.


Pensé que lo agregaría a esto, ya que acabo de buscar algo que vi en VS2015 y proporciona una solución alternativa. En el diseñador hay un botón para "Deshabilitar código de proyecto".

Estoy asumiendo que tu ViewModel está siendo instanciado y haciendo cosas desde tu código. Sé que rompe MVVM puro, pero he visto a mucha gente hacer cosas como DataContext = new MyViewModel(); dentro del constructor en el código detrás.

Alternar este botón debería resolver ese problema y ayuda a mantener su código más limpio. Visite MSDN para obtener más información.

Aquí está la imagen de la documentación de MSDN para que sepa cómo se ve. Estoy seguro de que el enlace se romperá eventualmente, de todos modos.

Vi esto en VS2015, pero no estoy seguro de qué edición se agregó esta función.

Como nota al margen, también funciona como una buena manera de volver a cargar el diseñador. Aunque fue lento cuando lo intenté. Tu kilometraje puede variar.


Solo para agregar a estas sugerencias, probablemente desee optimizar la implementación de producción.

Si necesita verificar el modo de diseño en el ViewModel, solo debe hacerlo cuando esté en modo DEBUG , de lo contrario, la versión liberada siempre tendrá que realizar comprobaciones innecesarias.
Al desarrollar, si está en modo de diseño, puede salir del método (o incluso eliminar algunos datos falsos).

Coloque este código como la primera línea de su constructor (o el código que se llame):

C # :

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

VB :

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


Todo depende de cómo configure el enlace entre la vista y el modelo de vista. Si es iniciado por la vista en el constructor (lo que parece probable teniendo en cuenta los síntomas), puede verificar IsInDesignMode desde allí. De lo contrario, debe proporcionar una visión general muy rápida de su arquitectura (o marco si usa alguno).


Utilizo la siguiente declaración en torno al código que solo puedo ejecutar en el tiempo de ejecución de la aplicación y, de lo contrario, causaría una excepción en el diseñador de XAML.

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


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