Использование атрибута x:key с DataTemplate из ресурсов в определении элемента управления XAML
У меня есть приложение WPF под названием Designer
, где MainWindow
(происходит от Window
) а также GraphControl
(происходит от UserControl
) классы размещаются в Designer
Сборка (которая устанавливается как стартовый проект). Приложение использует несколько других сборок, среди них GraphModel
сборка, которая содержит представление моделей для используемых элементов управления.
У меня мало DataTemplate
декларации в GraphControl.xaml
т.е. (список упрощен):
<UserControl x:Class="Designer.GraphControl"
xmlns:GraphModel="clr-namespace:GraphModel;assembly=GraphModel">
<UserControl.Resources>
<ResourceDictionary>
<DataTemplate DataType="{x:Type GraphModel:NodeViewModel}">
<!-- (...) -->
</DataTemplate>
</ResourceDictionary>
</UserControl.Resources>
</UserControl>
заявка Designer
работает правильно, как это было изобретено. После этого я создал новый Visual Studio Package
проект, чтобы сделать собственный редактор для VS2012, и мне нужно использовать мой GraphControl
от Designer
собрание в Package
проект. Я заметил, что мое испытание на включение контроля WPF в Package
проект вызывает исключение:
System.Windows.Markup.XamlParseException
Message=Set property 'System.Windows.ResourceDictionary.DeferrableContent' threw an exception.
Source=PresentationFramework
LineNumber=0
LinePosition=0
InnerException: System.IO.FileNotFoundException
Source=mscorlib
Message=Could not load file or assembly 'GraphModel, PublicKeyToken=c2639211081ade27' or one of its dependencies. The system cannot find the file specified.
После этого я обнаружил, что если я добавлю x:key
приписать выше DataTemplate
элемент, вышеупомянутое исключение не возникает, и элемент управления отображается в Designer
Применение и в Package
Приложение, но элемент пользовательского интерфейса (NodeItem
контроль), который представлен NodeViewModel
не отображается на экране, но я вижу только странный маленький элемент управления выглядит TextBlock
с текстом GraphModel.NodeViewModel вместо оригинального NodeItem
контроль. Бывает бота в Designer
а также Package
Приложения.
У меня вопрос: что я делаю не так и как мне исправить код, чтобы иметь рабочий контроль в обоих приложениях. Спасибо за внимание.
1 ответ
Вы добавили ссылку на GraphModel
собрание от Package
проект? Как вы пытаетесь использовать его в этом приложении? Вы загрузили пустой пользовательский элемент управления, можете ли вы также загрузить часть с источником данных. Я спрашиваю, потому что предметы, которые вы передаете GraphControl
должно быть GraphModel:NodeViewModel
тип для применения этого шаблона.
На мой взгляд, это работает остроумие x:Key
только потому, что вы не используете его в приложении (этот ключ может быть использован только в GraphControl
с StaticResource
или же DynamicResource
потому что вы объявили DataTemplate на GraphControl
уровень ресурсов). Таким образом, в результате у вас есть небольшие элементы без вашего шаблона, и нет необходимости в GraphModel:NodeViewModel
происходит.