WPF MVVM ViewModel构造函数designmode

Sna*_*ake 10 .net wpf mvvm

我有一个主要的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>
Run Code Online (Sandbox Code Playgroud)

而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; }
Run Code Online (Sandbox Code Playgroud)

现在问题是在designermode中我看不到我的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
    }
Run Code Online (Sandbox Code Playgroud)

它甚至可以在设计时完美地执行.

小智 11

如果要在XAML中设置DataContext,可以在ViewModel ctor的顶部使用它:

if (DesignerProperties.GetIsInDesignMode(new DependencyObject()))
    return;
Run Code Online (Sandbox Code Playgroud)


Ric*_*ard 7

你可以尝试的只是在后面的代码中设置DataContext,看看是否能解决问题.它几乎完全相同,但也许你的IDE只是在玩.

DataContext = new MainViewModel();
Run Code Online (Sandbox Code Playgroud)

  • 因为这不是在MVVM概念中完成的:) (3认同)

小智 5

这将允许您查看设计师.

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

  • 这似乎只适用于Silverlight而不是WPF? (14认同)