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