WPF Application level ViewModel

I'm new to WPF and MVVM, but I'm trying to create an application-level viewmodel for the multiple windows in my application. Here's my code:

ApplicationViewModel.cs:

public class ApplicationViewModel : ViewModelBase
{
   // for MainWindow
   private MainWindowViewModel mainWindowViewModel;
   public MainWindowViewModel MainWindowViewModel
   {
      get { return this.mainWindowViewModel; }
      private set
      {
         this.mainWindowViewModel = value;
         OnPropertyChanged("MainWindowViewModel");
      }
   }

   // other window code...

   public ApplicationViewModel()
   {
      this.mainWindowViewModel = new MainWindowViewModel();

      // Now show the MainWindow
      MainWindow mainWindow = new MainWindow();
      mainWindow.Show();
   }
}

App.xaml:

<Application x:Class="SomeApp.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:viewModel="clr-namespace:SomeApp.viewModel">
   <Application.Resources>
      <viewModel:ApplicationViewModel x:Key="applicationViewModel" />
...

MainWindow.xaml:

<Window x:Class="SomeApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:viewModel="clr-namespace:SomeApp.viewModel">
<Grid DataContext="{StaticResource applicationViewModel}">
   <TextBox Name="courseNameTxtBox" Width="200" MaxLength="251"
            Text="{Binding Path=MainWindowViewModel.SomeMainWindowObject,ValidatesOnDataErrors=True,UpdateSourceTrigger=PropertyChanged}" />
...

For some reason, it seems that applicationViewModel is never instantiated as the MainWindow is never displayed. What am I doing wrong?

I have also tried this:

App.xaml:

<Application x:Class="CourseAttendanceTracking.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             Startup="Application_Startup">
...

App.xaml.cs:

public partial class App : Application
{
   private void Application_Startup(object sender, StartupEventArgs e)
   {
      this.Resources.Add("applicationViewModel", new ApplicationViewModel());
   }
}

And I get this error:

System.Windows.Markup.XamlParseException occurred Message='Provide value on 'System.Windows.StaticResourceExtension' threw an exception.' Line number '15' and line position '19'.
Source=PresentationFramework LineNumber=15 LinePosition=19
StackTrace: at System.Windows.Markup.XamlReader.RewrapException(Exception e, IXamlLineInfo lineInfo, Uri baseUri) at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri) at System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri) at System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream) at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator) at SomeApp.MainWindow.InitializeComponent() in MainWindow.xaml:line 1 at SomeApp.MainWindow..ctor() in MainWindow.xaml.cs:line 25 InnerException: Message=Cannot find resource named 'applicationViewModel'. Resource names are case sensitive. Source=PresentationFramework StackTrace: at System.Windows.StaticResourceExtension.ProvideValueInternal(IServiceProvider serviceProvider, Boolean allowDeferredReference) at System.Windows.StaticResourceExtension.ProvideValue(IServiceProvider serviceProvider) at MS.Internal.Xaml.Runtime.ClrObjectRuntime.CallProvideValue(MarkupExtension me, IServiceProvider serviceProvider) InnerException:

My XAML works fine if I do this though:

MainWindow.xaml
<Window.Resources>
   <viewModel:ApplicationViewModel x:Key="applicationViewModel" />

But I really don't want to instantiate the ApplicationViewModel in this Window as I won't be able to see it in another window. Thanks in advance.


尝试更改{DynamicResource XXX}{StaticResource XXX} {DynamicResource XXX}

链接地址: http://www.djcxy.com/p/30522.html

上一篇: 应用程序启动时发生随机InvalidOperationException

下一篇: WPF应用程序级别ViewModel