StaticResource работает в дизайне, создает исключение XamlParseException во время выполнения - PullRequest
1 голос
/ 09 июня 2011

Это кажется таким глупым, но я искал пару часов, и ничего, что я нашел, не решает эту проблему.

Я использую MvvmLight. У меня есть простое MainWindow, в котором нет ничего, кроме сетки. У меня есть другой класс, который является WPF UserControl, который содержит одну кнопку. Оба из них имеют

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

в их определении узла (либо Window, либо UserControl). App.xaml имеет стандартную запись в своих ресурсах:

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

Я играю с сообщениями, и у меня есть сообщение о загрузке этого UserControl в MainWindow. Я могу проследить, и все работает просто замечательно - вплоть до того момента, когда он создает экземпляр нового UserControl, а код позади выполняет свой InitializeComponent ().

На этом этапе приложение останавливается в файле .xaml пользовательского элемента управления с XamlParseException, жалуясь, что не может найти «Локатор» (и, да, я знаю, имена ресурсов чувствительны к регистру, спасибо).

Это абсолютно бессмысленно для меня. В режиме конструктора в пользовательском элементе управления я могу перейти к нужному контексту данных - он видит Locator, а Locator видит Main, а Main видит свойство, которое я привязываю к кнопке. И дизайнер ПОКАЗЫВАЕТ текст на кнопке.

Любой ???

Это C # в VS 2010 Ultimate, v10.0.30319.1, работающей в Windows 7.

1 Ответ

0 голосов
/ 10 июня 2011

Что ж, имеет значение вопрос об обмене сообщениями и его порядок в отношении создания экземпляра объекта xaml (например, InitializeComponent).В моем исходном коде я отправлял сообщение для загрузки UserControl из конструктора MainViewModel;это происходило во время вызова InitializeComponent () MainWindow.

Удалил сообщение из конструктора и просто загрузил UserControl в MainWindow AFTER, возвращаясь из метода InitializeComponent ().Конечно же, нет проблем, все работало нормально.

Итак, я добавил метод MainViewModel с именем UIReady () и вызвал его из MainWindow ПОСЛЕ инициализации InitializeComponent ().Метод UIReady () в MainViewModel просто выдает сообщение для загрузки UserControl.И это работает, нет проблем.Итак, дополнительный метод для координации вещей, но он выполняет то, что я хочу - MainWindow не имеет представления о том, что UserControl будет загружен в него, пока ViewModel не запросит конкретное представление.Затем он загружает UserControl, который представляет это представление.

Я не знаю достаточно обо всех концах и концах InitializeComponent, но кое-что там не любит инициализировать другой объект xaml, пока не завершит свою собственную инициализацию;он теряет связь с такими вещами, как Ресурсы приложений.

...