【发布时间】:2012-02-28 22:50:12
【问题描述】:
重现错误:
创建一个新的 MVVM-Light WPF 应用程序。
将 MainWindow.xaml 复制到 MainWindow2.xaml 将 MainWindow2 的类名重命名为 MainWindow2(和构造函数)
将 MainWindow2 窗口类属性重命名为 "x:Class="MvvmLight2.MainWindow2"
从 App.xaml 中删除 StartupUri
将以下内容添加到应用程序:
protected override void OnStartup(StartupEventArgs e)
{
new MainWindow().Show();
new MainWindow2().Show();
}
运行应用程序并得到错误:
Cannot find resource named '{Locator}'. Resource names are case sensitive. Error at object 'System.Windows.Data.Binding' in markup file 'MvvmLight2;component/mainwindow.xaml' Line 10 Position 9.
解决错误: 从两个窗口中删除 DataContext="{Binding Main, Source={StaticResource Locator}}"。
将以下行添加到两个窗口的构造函数中:
DataContext = new ViewModelLocator().Main;
应用程序现在运行。
问题是为什么它不能识别定位器,即使它被定义为应用程序资源?
更新:
我刚刚注意到我可以在 xaml 和代码中添加相同的资源,而不会产生任何可见的副作用。现在的问题变成了,这有问题吗?它会创建重复的资源还是因为它们具有相同的密钥而没有? 不仅仅是破解它,我还试图了解发生了什么。
【问题讨论】:
-
如果你把
base.OnStartup(e)放在new MainWindow().Show()之前会发生什么? -
在它之前、之后和没有它时都得到相同的错误。
-
为什么不直接在
OnStartup覆盖中添加资源(而不是app.xaml),然后再显示窗口? -
资源具有属性 d:IsDataSource="True" 使其更易于设计。如何在代码中设置此属性? (资源字典只接受一个键和一个值)
-
好的,关于 Visual Studio designer 的一件事它不运行
App.xaml.cs代码隐藏文件(仅App.xaml标记)。因此,您应该能够在设计时保留App.xaml标记,然后在OnStartup:Resources.Add("Locator", new ViewModelLocator())'
标签: wpf xaml mvvm-light