首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现自己的ViewModelLocator

实现自己的ViewModelLocator
EN

Stack Overflow用户
提问于 2016-01-26 03:22:57
回答 1查看 1.6K关注 0票数 3

我想自己实现ViewModelLocator。所以我实现了世界上最简单的应用程序。我做了一切,就像在教程中一样。但我还是有个例外:

XamlParseException发生 引发的异常:“System.Windows.Markup.XamlParseException”在PresentationFramework.dll中 附加信息:‘提供'System.Windows.StaticResourceExtension’的值‘抛出一个例外’。行号'8‘和行位置'9’。

这句话是:

代码语言:javascript
复制
DataContext="{Binding MainWindowViewModel, Source={StaticResource ViewModelLocator}}">

以下是代码:

App.xaml

代码语言:javascript
复制
<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

代码语言:javascript
复制
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

代码语言:javascript
复制
namespace ViewModelLocatorDemo
{
    using ViewModels;

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

MainWindow.xaml

代码语言:javascript
复制
<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

代码语言:javascript
复制
namespace ViewModelLocatorDemo.ViewModels
{
    public class MainWindowViewModel
    {
        public string MainText { get; set; }

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

这个答案中,我发现:

确保在使用之前(按Xaml解析顺序)定义了资源。最简单的方法是把它放到App.xaml中

所以我把它放在App.xaml里。有人能解释一下这是怎么回事吗?我为什么要犯这个错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-26 06:13:44

您正在遇到这个bug 如果我的应用程序没有设置一个App.xaml文件,WPF - StartupUri文件不会被解析?

从这一页:

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

在这一页中,有3种解决方案(在此总结以确保完整性):

  • 添加x:Name="App"
  • 在App.xaml中添加更多资源,如<viewModelLocatorDemo:ViewModelLocator x:Key="ViewModelLocator"/><viewModelLocatorDemo:ViewModelLocator x:Key="ViewModelLocator2"/>
  • 与其重写OnStartup,不如尝试使用事件,Startup="Application_Startup"

这一点显然不明显,而且很难排除故障,甚至在我自己的搜索中找到答案。希望这个答案能帮助其他人找到另一个答案。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35006559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档