这看起来很傻,但我一直在寻找几个小时而且没有找到解决这个问题的任何东西。
我正在使用MvvmLight。我有一个简单的MainWindow,除了Grid之外什么都没有。我有另一个类,它是一个包含一个按钮的WPF UserControl。这两个都有
DataContext="{Binding Main, Source={StaticResource Locator}}"
在他们的节点定义中(Window或UserControl)。 App.xaml在其资源中有标准条目:
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
我正在玩消息,我收到一条消息,说明在MainWindow中加载此UserControl。我可以追踪并且一切都可以正常工作 - 直到它实例化新的UserControl并且后面的代码执行其InitializeComponent()。
此时应用程序在用户控件的.xaml文件中停止,并且XamlParseException抱怨它无法找到“Locator”(是的,我知道,资源名称区分大小写,谢谢)。
这对我来说毫无意义。在用户控件的设计模式中,我可以导航到我想要的数据上下文 - 它看到Locator,Locator看到Main,Main看到我绑定到按钮的属性。设计师在按钮上显示文字。
有人???
这是VS 2010 Ultimate中的C#,v10.0.30319.1,在Windows 7中运行。
答案 0 :(得分:0)
嗯,关于实例化xaml对象(例如,InitializeComponent)的消息传递及其顺序确实很重要。在我的原始代码中,我发送消息以从MainViewModel构造函数加载UserControl;这是在MainWindow的InitializeComponent()调用期间发生的。
从构造函数中删除了消息,并在从InitializeComponent()方法返回的MainWindow AFTER中简单地加载了UserControl。果然,没问题,它运作正常。
然后我向MainViewModel添加了一个名为UIReady()的方法,并在完成后从MainWindow调用了这个方法。 MainViewModel中的UIReady()方法只是发出加载UserControl的消息。它有效,没问题。这是一个协调事物的额外方法,但它实现了我想要的东西 - 在ViewModel请求特定视图之前,MainWindow不知道将在其中加载什么UserControl。然后它加载表示该视图的UserControl。
我对InitializeComponent的所有结束和结束都知之甚少,但是SOMETHING并不喜欢在完成自己的初始化之前初始化另一个xaml obect;它与事物失去联系 - 比如应用资源。