【问题标题】:Cannot find resource named 'ViewModelLocator' exception找不到名为“ViewModelLocator”异常的资源
【发布时间】:2013-10-01 10:21:09
【问题描述】:

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

public class ViewModelLocator
    {
        public ShellViewModel ShellPage
        {
            get
            {
                return new ShellViewModel();
            }
        }
}

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>

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();            
        }
    }

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>

我可以在 Visual Studio 设计器中看到正确的标题,但是当我运行应用程序时,得到 XamlParseException: '在 'System.Windows.StaticResourceExtension' 上提供值引发了异常。'行号“11”和行位置“9”。

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

我错过了什么吗?

【问题讨论】:

  • +1 因为文档对于在 MVVM-Light 中添加 View/ViewModel 来说太糟糕了。
  • @ZachSmith 在这里,我只是使用我自己的简单 ViewModelLocator 类,没有来自 MVVM 灯。
  • 我意识到了。对此感到抱歉。

标签: wpf mvvm mvvm-light viewmodellocator


【解决方案1】:

尝试将其放入 ResourceDictionary

<Application.Resources>
    <ResourceDictionary>
        <vm:ViewModelLocator x:Key="ViewModelLocator" />
    </ResourceDictionary>
</Application.Resources>

编辑:

我通过在 App 中使用 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>

代码

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

【讨论】:

  • @mdm20 现在我没有收到错误但窗口没有显示
  • 尝试删除并重新创建 app.xaml。请记住将构建操作设置为 ApplicationDefinition
【解决方案2】:

在启动时您正在加载窗口,我认为这不是一个好习惯,因为在您的窗口所依赖的两个应用程序中,资源尚未完全解决。即使您在设计时看到属性加载,这并不总是一个好的论据,尽管设计遵循另一种逻辑来执行代码。
您必须让 App 和 Windows 加载,然后在 Window 的网格中填充上下文属性


从 App.xaml 中删除资源 XAML(它看起来确实超出了那里的范围)并改为执行此操作:

 <Window.Resources>
        <wpfApplication1:ViewModelLocator x:Key="ViewModelLocator" />
    </Window.Resources>

    <Grid   DataContext="{Binding ShellPage, Source={StaticResource ViewModelLocator}}">
        <TextBlock Text="{Binding Title}"></TextBlock>
    </Grid>

【讨论】:

    【解决方案3】:

    看来我找到了解决方案。原因可能是App.xaml中的StartUrl。

    1.去掉App.xaml中默认的StartUrl。像这样:

            <Application x:Class="BidingAccessories.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" d1p1:Ignorable="d"
                         xmlns:d1p1="http://schemas.openxmlformats.org/markup-compatibility/2006">
                <Application.Resources>
                    <ResourceDictionary>
                        <vm:ViewModelLocator x:Key="Locator" xmlns:vm="clr-namespace:BidingAccessories.ViewModel" />
                        <ResourceDictionary.MergedDictionaries>
                            <ResourceDictionary Source="pack://application:,,,/BidingCommon;component/CommonStyleDictionary.xaml" />
                        </ResourceDictionary.MergedDictionaries>
                    </ResourceDictionary>
                </Application.Resources>
            </Application>
            </Application.Resources>
            </Application>
    

    2。覆盖App.xaml.cs中的OnstartUp事件

        protected override void OnStartup(StartupEventArgs e)
            {
                StartupUri = new Uri("MainWindow.xaml", UriKind.Relative);
        }
    

    【讨论】:

      【解决方案4】:

      删除这部分代码并再次运行。我不确定内部发生了什么,但这就是引发异常的原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-01
        • 2012-11-20
        • 2011-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多