2010-03-23 14 views
10

Tengo una ventana de WPF principal:WPF MVVM modelo de vista DesignMode constructor

<Window x:Class="NorthwindInterface.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:ViewModels="clr-namespace:NorthwindInterface.ViewModels" Title="MainWindow" Height="350" Width="525"> 
    <Window.DataContext> 
     <ViewModels:MainViewModel /> 
    </Window.DataContext> 
    <ListView ItemsSource="{Binding Path=Customers}"> 

    </ListView> 
</Window> 

Y el MainViewModel es la siguiente:

class MainViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged = delegate { }; 

    public MainViewModel() 
    { 
     Console.WriteLine("test"); 
     using (NorthwindEntities northwindEntities = new NorthwindEntities()) 
     { 
      this.Customers = (from c in northwindEntities.Customers 
           select c).ToList(); 
     } 
    } 

    public List<Customer> Customers { get;private set; } 

Ahora el problema es que en Designermode no puedo ver a mi MainViewModel, lo resalta diciendo que no puede crear una instancia de MainViewModel. Se está conectando a una base de datos. Por eso (cuando comento el código, el problema está resuelto).

Pero no quiero eso. ¿Alguna solución sobre las mejores prácticas en torno a esto?

y por qué este trabajo cuando se trabaja con MVVM:

/// <summary> 
    /// Initializes a new instance of the <see cref="MainViewModel"/> class. 
    /// </summary> 
    public MainViewModel() 
    { 
     // Just providing a default Uri to use here... 
     this.Uri = new Uri("http://www.microsoft.com/feeds/msdn/en-us/rss.xml"); 
     this.LoadFeedCommand = new ActionCommand(() => this.Feed = Feed.Read(this.Uri),() => true); 
     this.LoadFeedCommand.Execute(null); // Provide default set of behavior 
    } 

Incluso se ejecuta perfectamente en tiempo de diseño.

Respuesta

4

Esto le permitirá ver al diseñador.

public MainViewModel() 
{ 
    if (!DesignerProperties.IsInDesignTool) 
    { 
     Console.WriteLine("test"); 
     using (NorthwindEntities northwindEntities = new NorthwindEntities()) 
     { 
     this.Customers = (from c in northwindEntities.Customers 
          select c).ToList(); 
     } 
    } 
} 
+0

A) ¿Qué hace DesignerProperties.IsInDesignTool? B) No puedo encontrar esta propiedad en DesignerProperties –

+12

¿Parece que esto solo funciona con Silverlight y no con WPF? – John

7

Lo que podría intentar es simplemente configurar el DataContext en el código subyacente y ver si eso resuelve el problema. Es más o menos lo mismo, pero tal vez su IDE solo esté jugando.

DataContext = new MainViewModel(); 
+3

Debido a eso no se hace en el concepto de MVVM :) – Snake

+1

@Snake: MVVM no te prohíbe escribir código secundario cuando sea necesario ... –

+1

En realidad, esto es perfectamente válido. MVVM! = Sin código detrás. MVVM == Ver preocupaciones en la Vista. –

0

He visto este mensaje de error cuando el ViewModel no tiene un constructor sin parámetros.

4

probar esto:

public MainViewModel() 
{ 
    if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(new System.Windows.DependencyObject())) 
    { 
     Console.WriteLine("test"); 
     using (NorthwindEntities northwindEntities = new NorthwindEntities()) 
     { 
     this.Customers = (from c in northwindEntities.Customers 
         select c).ToList(); 
     } 
    } 
} 
8

Si desea establecer el DataContext en XAML, se puede utilizar esta en la parte superior de su modelo de vista ctor:

if (DesignerProperties.GetIsInDesignMode(new DependencyObject())) 
    return; 
Cuestiones relacionadas