WPF应用程序级视图模型

WPF应用程序级视图模型,wpf,mvvm,Wpf,Mvvm,我不熟悉WPF和MVVM,但我正在尝试为我的应用程序中的多个窗口创建一个应用程序级viewmodel。这是我的密码: ApplicationViewModel.cs: public class ApplicationViewModel : ViewModelBase { // for MainWindow private MainWindowViewModel mainWindowViewModel; public MainWindowViewModel MainWindowV

我不熟悉WPF和MVVM,但我正在尝试为我的应用程序中的多个窗口创建一个应用程序级viewmodel。这是我的密码:

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();
   }
}
<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" />
...
<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}" />
...
<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">
...
public partial class App : Application
{
   private void Application_Startup(object sender, StartupEventArgs e)
   {
      this.Resources.Add("applicationViewModel", new ApplicationViewModel());
   }
}
App.xaml:

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();
   }
}
<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" />
...
<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}" />
...
<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">
...
public partial class App : Application
{
   private void Application_Startup(object sender, StartupEventArgs e)
   {
      this.Resources.Add("applicationViewModel", new ApplicationViewModel());
   }
}
我得到了这个错误:

System.Windows.Markup.XamlParseException发生消息=“提供” “System.Windows.StaticResourceExtension”上的值引发了异常 行号“15”和行位置“19”。
Source=presentationframeworklinenumber=15 LinePosition=19
StackTrace:在 System.Windows.Markup.XamlReader.RewrapException(异常e, IXamlLineInfo lineInfo,Uri baseUri)位于 System.Windows.Markup.WpfXamlLoader.Load(XamlReader-XamlReader, IXamlObjectWriterFactory writerFactory,布尔型 skipJournaledProperties、Object rootObject、XamlObjectWriterSettings 设置,Uri baseUri)位于 System.Windows.Markup.wpfxamloader.LoadBaml(XamlReader-XamlReader, 布尔skipJournaledProperties,对象rootObject,XamlAccessLevel 访问级别,Uri baseUri)位于 System.Windows.Markup.XamlReader.LoadBaml(Stream,ParserContext parserContext、对象父对象、布尔closeStream)位于 System.Windows.Application.LoadComponent(对象组件,Uri 中的SomeApp.MainWindow.InitializeComponent()处的resourceLocator) \xaml:SomeApp.MainWindow..ctor()中的第1行 \MainWindow.xaml.cs:第25行InnerException:消息=找不到 名为“applicationViewModel”的资源。资源名称大小写相同 敏感的Source=PresentationFramework堆栈跟踪: 位于System.Windows.StaticResourceExtension.ProviderValueInternal(IServiceProvider serviceProvider,布尔allowDeferredReference) 在System.Windows.StaticResourceExtension.ProvideValue(IServiceProvider)中 服务提供商) 位于MS.Internal.Xaml.Runtime.ClrObjectRuntime.CallProviderValue(MarkupExtension me,IServiceProvider服务提供商)内部异常:

如果我这样做,我的XAML工作正常:

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

但我真的不想在此窗口中实例化ApplicationViewModel,因为我将无法在另一个窗口中看到它。提前感谢。

尝试更改
{StaticResource XXX}
以获得
{DynamicResource XXX}

对于初学者,如果您想正确使用MVVM,您确实不应该在视图模型中实例化视图。@AdiLester我确实这样做了。。别以为我是初学者。纯MVVM中正确的实例化方案是什么?我不关心测试,也不使用IoC。ApplicationViewModel为测试目的创建了主窗口。通常我在App.xaml中创建它,但这使得调试更容易——弹出窗口,调用构造函数;窗口没有弹出,构造函数没有调用。我很抱歉,它工作了(使用应用程序启动方法)。谢谢知道为什么在中创建ViewModel不起作用吗?