2010-09-21 7 views

Respuesta

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

Deja una fuente de datos en tiempo de diseño en su XAML como esto:

<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 tiempo de diseño modelo de vista heredar del modelo de vista tiempo de ejecución, pero burlarse de seguridad de los datos en el constructor. También puede que tenga que hacer algo con su modelo de vista de tiempo de ejecución para que el modelo de vista de tiempo de diseño no ejecute el código de acceso a datos.

+0

Parece que Visual Studio se bloquea cuando hay una excepción no controlada en el ViewModel cuando se hace de esta manera. –

+0

Mi experiencia es que la ventana de diseño se cuelga con gracia, no todo el estudio. – Guge

1

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

+0

Todo el enlace se realiza en XAML como en el artículo de Josh Smith sobre MVVM. –

4

utilizo la siguiente declaración en torno código que sólo puedo ejecutar la aplicación en tiempo de ejecución y, de otro modo causar una excepción en el diseñador de XAML.

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

Simplemente para agregar a estas sugerencias, es probable que 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 el 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).

poner este código como la primera línea de su constructor (o cualquier código que se está llamando):

C#:

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

VB:

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

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

Supongo que su instancia de ViewModel está siendo instanciada y haciendo cosas de su código. Sé que rompe MVVM puro, pero he visto mucha gente hacer cosas como DataContext = new MyViewModel(); dentro del constructor en el código detrás.

Alternar este botón debería solucionar ese problema y ayuda a mantener su código más limpio. Consulte 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.

enter image description here

manchado este en VS2015, pero no está seguro de qué edición se añadió esta característica.

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

Cuestiones relacionadas