无法创建“MainViewModel”的实例

时间:2013-01-11 11:43:49

标签: c# wpf wpfdatagrid

我正在创建一个简单的WPF应用程序,用于使用Observable集合实现数据绑定到数据库的数据绑定(遵循MVVM模式)。

App.xaml.cs类

public partial class App : Application
 {
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        var mainWindow = new MainWindow();
        var viewModel = new MainViewModel();
        mainWindow.Show();
    }
}

当我尝试将其绑定到我的XAML时,我产生了以下错误:

无法创建“MainViewModel”

的实例

XAML代码:

  <Window x:Class="MVVM_DemoAppl.Views.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:ViewModel="clr-namespace:MVVM_DemoAppl.ViewModels"
    Title="MainWindow" Height="350" Width="525">
    <!-- The error is raised here -->
   <Window.DataContext> 
     <ViewModel:MainViewModel/> 
   </Window.DataContext>

如何克服这个错误?感谢。

P.S:我在MSDN forums上发布了同样的问题,但是在我的整个代码中,请寻求更好的理解。

根据用户的建议,我是否必须以这种方式保留我的OnStartup()?

 public partial class App : Application
 {
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
    }
}

2 个答案:

答案 0 :(得分:1)

尝试在MainWindow的构造函数上进行绑定,并将其从XAML中删除:

public MainWindow()
{
   InitializeComponent();
   DataContext = new MainViewModel();
}

这应该有用..

答案 1 :(得分:0)

您正在混合两种设置DataContext的方法。选择一个并继续使用。

如果你的viewmodel有默认的构造函数(即没有参数的构造函数),你可以在xaml中完成所有操作:

  <Window x:Class="MVVM_DemoAppl.Views.MainWindow"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     xmlns:ViewModel="clr-namespace:MVVM_DemoAppl.ViewModels"
     Title="MainWindow" Height="350" Width="525">
     <Window.DataContext>
         <! This instantiates a MainViewModel and binds this view to the viewmodel.
         <ViewModel:MainViewModel/> 
     </Window.DataContext>

或者你在视图中取消设置Window.DataContext并在其他地方单独执行,也许在之前的OnStartup()中。

public partial class App : Application
{
   protected override void OnStartup(StartupEventArgs e)
   {
      base.OnStartup(e);
      var mainWindow = new MainWindow();
      var viewModel = new MainViewModel();
      mainWindow.DataContext = viewModel; // Bind the ViewModel to the Window Datacontext.
      mainWindow.Show();
   }
}