WPF MVVM ViewModel constructor designmode
I've got a main WPF window:
<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>
And the MainViewModel
is this:
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; }
Now the problem is that in designermode I can't see my MainViewModel
, it highlights it saying that it can't create an instance of the MainViewModel
. It is connecting to a database. That is why (when I comment the code the problem is solved).
But I don't want that. Any solutions on best practices around this?
And why does this work when working with MVVM:
/// <summary>
/// Initializes a new ins开发者_如何学Ctance 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
}
It even executes perfectly at design time.
If you want to set the DataContext
in XAML, you can use this at the top of your ViewModel
ctor:
if (DesignerProperties.GetIsInDesignMode(new DependencyObject()))
return;
What you could try is just setting the DataContext
in the code behind and see if that resolves the issue. It is pretty much the exact same thing, but maybe your IDE is just playing up.
DataContext = new MainViewModel();
This will allow you to see the designer.
public MainViewModel()
{
if (!DesignerProperties.IsInDesignTool)
{
Console.WriteLine("test");
using (NorthwindEntities northwindEntities = new NorthwindEntities())
{
this.Customers = (from c in northwindEntities.Customers
select c).ToList();
}
}
}
try this:
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();
}
}
}
I have seen this error message when the ViewModel
does not have a parameterless constructor.
精彩评论