【问题标题】:Implementing own ViewModelLocator实现自己的 ViewModelLocator
【发布时间】:2016-05-02 14:04:19
【问题描述】:

我想自己实现 ViewModelLocator。所以我实现了世界上最简单的应用程序。我按照this 教程中的方法完成了所有操作。但我仍然遇到异常:

发生 XamlParseException

抛出异常:“System.Windows.Markup.XamlParseException”在 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";
        }
    }
}

this answer我发现:

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

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

【问题讨论】:

    标签: c# .net wpf xaml viewmodellocator


    【解决方案1】:

    你遇到了这个错误WPF - App.xaml file does not get parsed if my app does not set a StartupUri?

    从那个页面:

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

    从该页面,有 3 种解决方案(为了完整起见,在此总结):

    • 添加x:Name="App"
    • 在 App.xaml 中添加更多资源,例如 &lt;viewModelLocatorDemo:ViewModelLocator x:Key="ViewModelLocator"/&gt;&lt;viewModelLocatorDemo:ViewModelLocator x:Key="ViewModelLocator2"/&gt;
    • 与其覆盖 OnStartup,不如尝试使用事件,Startup="Application_Startup"

    这绝对不是很明显,而且很难排除故障,甚至在我自己的搜索中也很难找到答案。希望this 的答案能帮助其他人找到other 的答案。

    【讨论】:

      猜你喜欢
      • 2017-02-22
      • 2012-02-12
      • 1970-01-01
      • 2017-09-19
      • 2015-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多