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