【问题标题】:StaticResource works in design, throws XamlParseException at runtimeStaticResource 在设计中起作用,在运行时抛出 XamlParseException
【发布时间】:2011-06-09 05:13:01
【问题描述】:

这看起来很愚蠢,但我已经寻找了几个小时,但没有找到解决这个问题的方法。

我正在使用 MvvmLight。我有一个简单的 MainWindow,里面只有一个 Grid。我有另一个类,它是一个包含一个按钮的 WPF UserControl。这两个都有

DataContext="{Binding Main, Source={StaticResource Locator}}"

在它们的节点定义中(Window 或 UserControl)。 App.xaml 在其资源中有标准条目:

<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />

我正在玩消息传递,我收到一条消息,说在主窗口中加载此 UserControl。我可以追踪,一切正常——直到它实例化新的 UserControl 并且后面的代码执行它的 InitializeComponent()。

此时,应用程序在用户控件的 .xaml 文件中停止,并出现 XamlParseException 抱怨它找不到“Locator”(是的,我知道,资源名称区分大小写,谢谢)。

这对我来说完全没有意义。在用户控件的设计模式下,我可以导航到我想要的数据上下文——它看到 Locator,Locator 看到 Main,Main 看到我绑定到按钮的属性。并且设计师在按钮上显示了文字。

有人吗???

这是 VS 2010 Ultimate 中的 C#,v10.0.30319.1,在 Windows 7 中运行。

【问题讨论】:

  • 这可能不会有什么不同,但试试{Binding Path=Main, Source={StaticResource Locator}}。这也可能适用:codeproject.com/Tips/173712/…
  • 不,Path=Main 没有区别。在 Locator 前面也没有添加“ResourceKey=”。
  • 发布压缩复制品? App.xaml 的构建操作是什么?您是在为您的应用程序使用生成的入口点,还是在指定自定义入口点?

标签: c# wpf visual-studio-2010 mvvm-light


【解决方案1】:

嗯,关于实例化 xaml 对象(例如 InitializeComponent)的消息传递和传递顺序确实很重要。在我的原始代码中,我发送消息以从 MainViewModel 构造函数加载 UserControl;这是在 MainWindow 的 InitializeComponent() 调用期间发生的。

从构造函数中删除了消息,并在从 InitializeComponent() 方法返回后简单地将 UserControl 加载到 MainWindow 中。果然,没问题,效果很好。

然后我向 MainViewModel 添加了一个名为 UIReady() 的方法,并在 InitializeComponent() 完成后从 MainWindow 调用该方法。 MainViewModel 中的 UIReady() 方法只是发出消息以加载 UserControl。它有效,没问题。所以一个额外的方法来协调事情,但它完成了我想要的——MainWindow 不知道要在其中加载什么 UserControl,直到 ViewModel 请求特定的 View。然后它加载代表该视图的 UserControl。

我对 InitializeComponent 的所有结束和结束了解不够,但其中的某些东西不喜欢初始化另一个 xaml 对象,直到它完成自己的初始化;它与事物失去联系——比如应用程序资源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多