Подтвердить что ты не робот

Какова область применения StaticResource в WPF ResourceDictionary?

У меня есть WPF ResourceDictionary со следующим TextBlock:

<TextBlock Visibility="{Binding Converter={StaticResource MyBoolProp ResourceKey=BoolToVis}}">
</TextBlock>

ResourceDictionary включен в App.xaml в разделе MergedDictionaries:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="MyResourceDictionary.xaml"/>

В App.xaml я определил конвертер BoolToVis (опять же, под Application.Resources)

<BooleanToVisibilityConverter x:Key="BoolToVis" />

Когда я запускаю свое приложение, я получаю следующее исключение XamlParseException:

"Укажите значение 'System.Windows.Markup.StaticResourceHolder' бросил исключение".

Внутреннее исключение:

"Невозможно найти ресурс с именем" BoolToVis ". Имена ресурсов чувствительны к регистру."

Я могу ссылаться на этот конвертер непосредственно с App.xaml(фактически, конкретное объявление XAML идентично) и внутри других UserControl без проблем.

Этот бит кода также отлично работает под .NET 4.0 RC (и Beta2). Эта ошибка началась только при обновлении до RTM.NET 4.0.

Я могу обойти это, объявив еще один BooleanToVisibilityConverter в MyResourceDictionary.xaml и ссылаясь на него следующим образом:

<TextBlock Visibility="{Binding Converter={StaticResource MyBoolProp ResourceKey=BoolToVis2}}">
</TextBlock>

Любая причина, по которой мне нужно будет это делать?

4b9b3361

Ответ 1

Per MSDN:

Ресурсы в объединенном словаре занимают место в области поиска ресурса, которая сразу после области основного словаря ресурсов, в который они объединены.

Ресурсы, определенные в App.xaml, не могут быть замечены объединенным ResourceDictionary. Я бы подумал, что имеет смысл определить конвертер, используемый в ResourceDictionary в самом ResourceDictionary, или другой ResourceDictionary, в котором размещены все ваши преобразователи.