实现自己的ViewModelLocator

3
我想自己实现ViewModelLocator。所以我在世界上实现了最简单的应用程序。我按照this教程中的一切操作,但仍然出现异常:

XamlParseException发生

异常抛出:'System.Windows.Markup.XamlParseException' in PresentationFramework.dll

附加信息:'System.Windows.StaticResourceExtension'上的提供值引发了一个异常。'行号'8'和行位置'9'。

这是该行:
DataContext="{Binding MainWindowViewModel, Source={StaticResource ViewModelLocator}}">

这里是代码:

App.xaml

<Application x:Class="ViewModelLocatorDemo.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:viewModelLocatorDemo="clr-namespace:ViewModelLocatorDemo">
    <Application.Resources>
        <viewModelLocatorDemo:ViewModelLocator x:Key="ViewModelLocator"/>
    </Application.Resources>
</Application>

App.xaml.cs

namespace ViewModelLocatorDemo
{
    using System.Windows;
    using ViewModelLocatorDemo.Views;

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

            MainWindow mainWindow = new MainWindow();
            mainWindow.Show();
        }
    }
}

ViewModelLocator.cs

namespace ViewModelLocatorDemo
{
    using ViewModels;

    public class ViewModelLocator
    {
        public MainWindowViewModel MainWindowViewModel
        {
            get { return new MainWindowViewModel(); }
        }
    }
}

MainWindow.xaml

<Window x:Class="ViewModelLocatorDemo.Views.MainWindow"
        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"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow" Height="300" Width="300"
        DataContext="{Binding MainWindowViewModel, Source={StaticResource ViewModelLocator}}">
    <Grid>
        <Frame x:Name="MainFrame" Margin="50" BorderThickness="2" BorderBrush="Black" />
    </Grid>
</Window>

MainWindowViewModel.cs

namespace ViewModelLocatorDemo.ViewModels
{
    public class MainWindowViewModel
    {
        public string MainText { get; set; }

        public MainWindowViewModel()
        {
            MainText = "The first page";
        }
    }
}

这个答案中,我发现:

确保资源在使用之前被定义(按照Xaml解析顺序)。最简单的方法是将其放置在App.xaml中。

所以我把它放在了App.xaml中。能否有人解释一下这里发生了什么?为什么会出现这个错误?

1个回答

5
您遇到了这个错误:WPF-如果我的应用程序没有设置StartupUri,则不会解析App.xaml文件? 从该页面中得知:
引发这个问题的是VS代码生成错误,当App.xaml只包含一个入口并且没有StartupUri属性时,有时插入连接到程序其余部分所需的代码。
从该页面中还可以找到三种解决方案(在此总结):
  • 添加x:Name="App"
  • App.xaml中添加更多资源,如<viewModelLocatorDemo:ViewModelLocator x:Key="ViewModelLocator"/><viewModelLocatorDemo:ViewModelLocator x:Key="ViewModelLocator2"/>
  • 尝试使用事件而不是覆盖OnStartup,例如Startup="Application_Startup"
这绝对不是显而易见的,并且很难进行故障排除,甚至在我的搜索中也很难找到答案。希望这个答案能帮助其他人找到另一个答案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接