4

Observableコレクションを使用してDatagridをデータベースにDatabindingするための単純なWPFアプリケーションを作成しています(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>

このエラーを克服する方法は? ありがとう。

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 を設定する 2 つの異なる方法を混在させています。1つを選択して、それに従ってください。

ビューモデルにデフォルトのコンストラクター (つまり、引数のないコンストラクター) がある場合は、すべて 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 に答える