实现自己的ViewModelLocator

tob*_*wak 3 .net c# wpf xaml viewmodellocator

我希望自己实现ViewModelLocator.所以我实现了世界上最简单的应用程序.我做了教程中的所有内容.但我仍然得到一个例外:

发生了XamlParseException

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

附加信息:'为'System.Windows.StaticResourceExtension'提供价值引发了异常.行号'8'和行位置'9'.

这是这一行:

DataContext="{Binding MainWindowViewModel, Source={StaticResource ViewModelLocator}}">
Run Code Online (Sandbox Code Playgroud)

这是代码:

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>
Run Code Online (Sandbox Code Playgroud)

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ViewModelLocator.cs

namespace ViewModelLocatorDemo
{
    using ViewModels;

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

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>
Run Code Online (Sandbox Code Playgroud)

MainWindowViewModel.cs

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

        public MainWindowViewModel()
        {
            MainText = "The first page";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这个答案中,我发现:

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

所以我在App.xaml中有它.如果有人能解释一下这里发生了什么?为什么我收到此错误?

Kor*_*ill 5

遇到此错误WPF - 如果我的应用程序未设置StartupUri,则无法解析App.xaml文件?

从该页面:

有一个VS代码生成错误,当只包含一个条目且没有StartupUri属性时,有时不会插入连接到程序其余部分所需的代码.

从该页面,有3个解决方案(这里总结完整性):

  • x:Name="App"
  • 在App.xaml中添加更多资源<viewModelLocatorDemo:ViewModelLocator x:Key="ViewModelLocator"/><viewModelLocatorDemo:ViewModelLocator x:Key="ViewModelLocator2"/>
  • 而不是覆盖OnStartup,尝试使用事件, Startup="Application_Startup"

这绝对不是很明显,很难排除故障甚至在我自己的搜索中找到答案.希望这个答案可以帮助别人找到其他的答案.