2016-01-31 4 views
0

Проблема раздражающего XAML: я определяю DataTemplate в файле словаря ресурсов, который должен получить доступ к конвертеру, определенному как ресурс в App.Resources. Логично, что я должен объединить словарь DataTemplate с помощью словаря App.Resources, и это должно быть так. Но я получаю исключение, говоря, что мой ресурс конвертера не найден. Я что-то упускаю? Ссылка? Порядок определения?XAML DataTemplate не может получить доступ к ресурсу приложения

Update: Вот мои App.Resources

<ResourceDictionary> 
    <!--Global Resources--> 
    <BooleanToVisibilityConverter x:Key="BoolToVis"/> 
    <!--System Resources--> 
    <sys:Boolean x:Key="True">True</sys:Boolean> 
    <sys:Boolean x:Key="False">False</sys:Boolean> 
    <!--Framework Resources--> 
    <fr:EnumToBoolConverter x:Key="EnumToBool"/> 
    <fr:EnumAttributeConverter x:Key="EnumToAttr"/> 
    <fr:FileInfoConverter x:Key="ToFileInfo"/> 
    <fr:ImageInfoConverter x:Key="ToImageInfo"/> 
    <fr:UnitConverter x:Key="ToUnit"/> 
    <fr:CommandParameterConverter x:Key="ToCmdParam"/> 
    <!--Style Resources--> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="pack://application:,,,/FrameworkUI;component/Styles/Dark3DStyles.xaml"/> 
     <ResourceDictionary Source="/Resources/DataTemplates.xaml/> 
    </ResourceDictionary.MergedDictionaries> 
</ResourceDictionary> 

... и вот это DataTemplate определен в словаре ресурсов файл

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
<DataTemplate x:Key="NoteEnumTemplate"> 
    <Grid Height="22"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="22"/> 
      <ColumnDefinition/> 
     </Grid.ColumnDefinitions> 
     <Image Grid.Column="0" Stretch="None" 
       Source="{Binding Converter={StaticResource EnumToAttr}, 
           ConverterParameter=ICON}"> 
      <Image.Effect> 
       <DropShadowEffect ShadowDepth="0"/> 
      </Image.Effect> 
     </Image> 
     <Label Grid.Column="1" 
       Content="{Binding Converter={StaticResource EnumToAttr}, 
           ConverterParameter=DESCR}"/> 
    </Grid> 
</DataTemplate> 

конвертер, который может» t находится EnumToAttr

+0

No. Путь =. не принимается. Клеменс, что ты говоришь, всегда работал на меня, поэтому я нахожу это странным. –

+0

Kylo Ren, сначала определяется конвертер, а затем словари объединяются. –

+0

@GeysserSdz Извините, я не видел этого в быстрый взгляд. Я сделал быстрый пример, чтобы быть уверенным. вы должны определить конвертер, прежде чем использовать его в словаре. прежде чем я не имел в виду, где вы написали синтаксис Merge Dictionary. Я имею в виду файл в случае слияния словаря. вызвать код слова слияния будет сначала перед любым другим кодом в разделе ресурсов. –

ответ

2

Ваша проблема порядок, в котором вы определили ресурсы/шаблон данных и порядок, в котором вы объединили словари.

Вы объединяетесь РесурсDictionary в App.Resources. Итак, ResourceDictionary является самым большим и должен иметь каждый ресурс (ключ) для запуска. Он не может использовать ключ, определенный в производном ResourceDictionary.

Переместить конвертер в ResourceDictionary, а затем посмотреть результат.

Вы написали код словаря слияния последним, но это не будет сделано. Ресурс должен быть в порядке выше, если вы видите в перспективе код, который будет генерироваться после компиляции.

Решение от вашего дизайна перспектива:

<ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="RD2.xaml" />//Converter code 
      <ResourceDictionary Source="RD.xaml" /> //Template code    
</ResourceDictionary.MergedDictionaries> 

Приведенный выше код будет работать код причины преобразователь всегда будет генерироваться до того кода шаблона.

+1

Это сделал Кило! Да прибудет с тобой сила! –

Смежные вопросы