4

我正在创建一个简单的 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>

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

PS:我在MSDN 论坛上发布了同样的问题,但我的整个代码,请看一下更好的理解。

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

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

2 回答 2

1

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

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

这应该工作..

于 2013-01-11T11:51:17.553 回答
0

您正在混合设置 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();
   }
}
于 2013-01-11T12:11:57.823 回答