Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实现自己的ViewModelLocator_C#_.net_Wpf_Xaml_Viewmodellocator - Fatal编程技术网

C# 实现自己的ViewModelLocator

C# 实现自己的ViewModelLocator,c#,.net,wpf,xaml,viewmodellocator,C#,.net,Wpf,Xaml,Viewmodellocator,我想自己实现ViewModelLocator。所以我实现了世界上最简单的应用程序。我做的一切都和教程中的一样。但我还是有个例外: 发生XamlParseException 引发异常:中的“System.Windows.Markup.XamlParseException” PresentationFramework.dll 其他信息:'提供有关 'System.Windows.StaticResourceExtension'引发异常。'Line 编号“8”和行位置“9” 这是这一行: DataCo

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

发生XamlParseException

引发异常:中的“System.Windows.Markup.XamlParseException” PresentationFramework.dll

其他信息:'提供有关 'System.Windows.StaticResourceExtension'引发异常。'Line 编号“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>
<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>
ViewModelLocator.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();
        }
    }
}
namespace ViewModelLocatorDemo
{
    using ViewModels;

    public class ViewModelLocator
    {
        public MainWindowViewModel MainWindowViewModel
        {
            get { return new MainWindowViewModel(); }
        }
    }
}
namespace ViewModelLocatorDemo.ViewModels
{
    public class MainWindowViewModel
    {
        public string MainText { get; set; }

        public MainWindowViewModel()
        {
            MainText = "The first page";
        }
    }
}
main window.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>
<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>
我发现:

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


所以我把它放在App.xaml中。如果有人能告诉我这里发生了什么?为什么我会犯这个错误

您遇到了此错误

从该页:

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

从该页开始,共有3种解决方案(为完整起见,在此进行总结):

  • 添加
    x:Name=“App”
  • 在App.xaml中添加更多资源,如
  • 不要在启动时重写,而是尝试使用一个事件,
    Startup=“Application\u Startup”
这绝对不是显而易见的,在我自己的搜索中很难排除故障,甚至很难找到答案。希望这个答案能帮助其他人找到另一个答案