找不到名为“ViewModelLocator”的资源异常

use*_*792 1 wpf mvvm mvvm-light viewmodellocator

我试图通过在 App.xaml 中将其声明为资源来使用 ViewModelLocator。它是一个非常简单的类,如下所示:

public class ViewModelLocator
    {
        public ShellViewModel ShellPage
        {
            get
            {
                return new ShellViewModel();
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

App.xaml 文件如下:

<Application x:Class="SomeNamespace.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:vm="clr-namespace:SomeNamespace.ViewModels">
    <Application.Resources>
         <vm:ViewModelLocator x:Key="ViewModelLocator" />
    </Application.Resources>
</Application>
Run Code Online (Sandbox Code Playgroud)

App.xaml.cs 如下:

public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            var view = new ShellView();
            Current.MainWindow = view;
            Current.MainWindow.Show();            
        }
    }
Run Code Online (Sandbox Code Playgroud)

ShellView.xaml 如下:

<Window 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        x:Class="SomeNamespace.ShellView"
        Title="MainWindow" 
        Height="350" 
        Width="525" 
        ResizeMode="NoResize" 
        MinWidth="700" 
        MinHeight="700"
        DataContext="{Binding ShellPage, Source={StaticResource ViewModelLocator}}"
        >
    <Grid>
        <TextBlock Text="{Binding Title}"></TextBlock>
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

我可以在 Visual Studio 设计器中看到正确的标题,但是当我运行应用程序时,得到 XamlParseException: 'Provide value on 'System.Windows.StaticResourceExtension' 抛出异常。行号“11”和行位置“9”。

内部异常具有{“找不到名为 'ViewModelLocator' 的资源。资源名称区分大小写。”}

我错过了什么吗?

mdm*_*m20 5

尝试将其放入 ResourceDictionary

<Application.Resources>
    <ResourceDictionary>
        <vm:ViewModelLocator x:Key="ViewModelLocator" />
    </ResourceDictionary>
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)

编辑:

我通过在应用程序中使用 Startup 事件而不是覆盖 OnStartup 解决了这个问题。

<Application x:Class="TestWPF.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:vm="clr-namespace:TestWPF.ViewModels"
             Startup="App_Startup">
    <Application.Resources>
          <vm:ViewModelLocator x:Key="ViewModelLocator" />
    </Application.Resources>
</Application>
Run Code Online (Sandbox Code Playgroud)

代码

public partial class App : Application
{
    void App_Startup(object sender, StartupEventArgs e)
    {
        var view = new ShellView();
        Current.MainWindow = view;
        Current.MainWindow.Show();
    }
}
Run Code Online (Sandbox Code Playgroud)