【问题标题】:Cannot create an instance of "MainViewModel"无法创建“MainViewModel”的实例
【发布时间】:2013-01-11 11:43:48
【问题描述】:

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

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

【问题讨论】:

  • 你有堆栈跟踪吗?
  • 您正在创建 MainViewModel 实例两次,一次是在 OnStartup() 中,一次是在您的 xaml 中定义 DataContext 时。
  • 如果您在 OnStartup 中没有做任何特别的事情,则无需捕获该事件。
  • 如果注释掉MainViewModel constructor中的代码initializeload();,是否还会出现错误?我有一种感觉,当您创建模型/数据库/其他东西时会出现一些错误,而这并不是 WPF 中的错误。如果您在将其注释掉后没有收到错误,请尝试查明产生错误的代码行。如果您使用 Visual Studio 并遇到异常,您可以通过“查看详细信息”链接打开异常详细信息并检查内部异常。这应该会给你一些关于问题实际出在哪里的线索。
  • .. 例如,Messages = table.Rows[i][3].ToString() Critical = Convert.ToBoolean(table.Rows[i][1]), 行似乎在initializeload 函数中放错了位置。虽然,这甚至不会编译。

标签: c# wpf wpfdatagrid


【解决方案1】:

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

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

这应该可以工作..

【讨论】:

  • 如果我从 XAML 中删除,如何将它绑定到数据网格中的 ItemsSource?
  • 您应该只从 XAML 中删除 DataContext 设置。绑定旨在在 XAML 上进行
  • 好的,现在可以了,我用 替换了我的 DataContext。我在输出中只能看到一个空的数据网格
  • @userXemY 那是因为你还没有创建那个对象! DataContext 是视图用来绑定的上下文,当您在 Resources 中定义它时,它不会被创建。这意味着您的视图没有绑定 DataContext,这就是数据网格为空的原因(如果您查看“调试输出”窗口,您应该会看到绑定失败)。 您必须找到在创建ViewModel时产生的错误
【解决方案2】:

您正在混合设置 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>

或者您在视图中保留 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();
   }
}

【讨论】:

    猜你喜欢
    • 2020-11-22
    • 2011-09-09
    • 2021-05-17
    • 2012-01-29
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多