开发者

WPF MVVM ViewModel constructor designmode

开发者 https://www.devze.com 2022-12-24 20:43 出处:网络
I\'ve got a main WPF window: <Window x:Class=\"NorthwindInterface.MainWindow\" xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"

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.

0

精彩评论

暂无评论...
验证码 换一张
取 消