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}
上一篇: 应用程序启动时发生随机InvalidOperationException
下一篇: WPF应用程序级别ViewModel