WPF MVVM ViewModel конструктор - PullRequest
       6

WPF MVVM ViewModel конструктор

10 голосов
/ 23 марта 2010

У меня есть главное окно wpf:

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

И MainViewModel это:

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

Теперь проблема в том, что в режиме конструктора я не вижу свою MainViewModel, она выделяет его, говоря, что он не может создать экземпляр MainViewModel. Это подключение к базе данных. Вот почему (когда я комментирую код, проблема решена).

Но я не хочу этого. Есть ли какие-либо решения в этой области?

И почему это работает при работе с 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
    }

Он даже отлично работает во время разработки.

Ответы [ 5 ]

11 голосов
/ 12 декабря 2014

Если вы хотите установить DataContext в XAML, вы можете использовать это в верхней части вашего ViewModel ctor:

if (DesignerProperties.GetIsInDesignMode(new DependencyObject()))
    return;
7 голосов
/ 23 марта 2010

Что вы можете попробовать, это просто установить DataContext в коде и посмотреть, решит ли это проблему.Это почти то же самое, но, возможно, ваша IDE просто играет.

DataContext = new MainViewModel();
5 голосов
/ 14 июля 2011

Это позволит вам увидеть дизайнера.

public MainViewModel()
{
    if (!DesignerProperties.IsInDesignTool)
    {
      Console.WriteLine("test");
      using (NorthwindEntities northwindEntities = new NorthwindEntities())
      {
        this.Customers = (from c in northwindEntities.Customers
                          select c).ToList();
      }
    }
}
4 голосов
/ 08 октября 2012

попробуйте это:

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();
      }
    }
}
0 голосов
/ 29 марта 2011

Я видел это сообщение об ошибке, когда ViewModel не имеет конструктора без параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...