tags:

views:

287

answers:

1

Right,

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

It even executes perfectly at designtime?

+3  A: 

Hi... 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();
Richard
Because that is not done in the MVVM concept :)
Snake
@Snake: MVVM doesn't forbid you to write code-behind when needed...
Thomas Levesque
Actually, this is perfectly valid. MVVM != no code behind. MVVM == View concerns in the View.
Ben Von Handorf
MVVM doesn't state that the View isn't allowed to have any code in it. In fact, many of the top MVVM experts repeatedly say that if it will take you an hour to do something in XAML and 5 minutes to do in code, then do it in code, as long as the segregation from the View to the ViewModel isn't broken. So the above is very acceptable in MVVM. And works in my test :)
Richard