Unable to instantiate "MainViewModel"

I am creating a simple WPF application to implement Datagrid database bindings using the Observable collection (after the MVVM template).

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

when I try to associate it with my XAML, I get the following error:

Cannnot create an instance of "MainViewModel"

XAML Code:

  <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> 

How to overcome this error? Thanks.

PS: I posted the same question on MSDN forums , but with all my code, kindly take a look at a better understanding.

As suggested by the user, should I support OnStartup () this way?

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

Try to bind to the MainWindow constructor and remove it from XAML:

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

That should work.

+1
source

You are mixing two different ways to set a DataContext. Choose one and go with it.

If your view models have standard constructors (i.e. constructors without arguments), you can do all this in 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> 

Or you leave Window.DataContext invisible in your view and execute it separately in another place, perhaps in OnStartup (), as before.

 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(); } } 
0
source

All Articles