无法创建“mainviewmodel”的实例

本文关键字:实例 mainviewmodel 创建 | 更新日期: 2023-09-27 17:51:15

我正在创建一个简单的WPFapplication,用于使用Observable collection(遵循MVVM模式)实现数据网格到数据库的数据绑定。

App.xaml.cs class

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论坛上发布了同样的问题,但我的整个代码,请看看更好的理解。

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

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

无法创建“mainviewmodel”的实例

尝试在MainWindow的构造函数上绑定并将其从XAML:

中删除。
public MainWindow()
{
   InitializeComponent();
   DataContext = new MainViewModel();
}

您正在混合设置DataContext的两种不同方式。选择一个,然后用它。

如果你的视图模型有默认构造函数(即没有参数的构造函数),你可以在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>

或者你离开窗口。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();
   }
}