Использование атрибута 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 происходит.

Другие вопросы по тегам