Жизненный цикл конвертера в целом такой же, как у любого экземпляра объекта XAML, и зависит от объявления. Обычно конвертер объявляется ресурсом ResourceDictionary
:
<Window.Resources>
<BooleanToVisibilityConverterx:Key="BooleanToVisibilityConverter" />
</Window.Resources>
В этом случае конвертер (или ресурс в целом) используется повторно для каждой ссылки на него. Это связано с атрибутом x:Shared
. Этот атрибут по умолчанию равен true
, что указывает синтаксическому анализатору XAML повторно использовать экземпляр объекта. Вы можете явно указать false
:
<Window.Resources>
<BooleanToVisibilityConverterx:Key="BooleanToVisibilityConverter" x:Shared="False" />
</Window.Resources>
Теперь при каждом обращении к ресурсу парсер XAML создает новый экземпляр.
Если вы объявите объект вне ResourceDictionary
, поведение синтаксического анализатора XAML будет другим. Вы можете назначить экземпляры объекта свойству, как описано выше, в качестве ресурса. Но вместо этого вы можете использовать Синтаксис элемента свойства , чтобы создать экземпляр объекта XAML:
<Binding Path="Values">
<Binding.Converter>
<BooleanToVisibilityConverter />
</Binding.Converter>
</Binding>
Это объявление приводит к экземпляру конвертера, который используется только для этой конкретной привязки (или свойства). Это объявление не ссылается на ресурс (используя StaticResource
или DynamicResource
), но явно создает экземпляр, который назначается исключительно свойству (в данном случае Binding.Converter
).
В качестве примечания:
StaticResource
не означает, что ресурс является статическим. Это расширение разметки, которое инструктирует синтаксическому анализатору XAML искать дерево ресурсов, чтобы найти предопределенный экземпляр. То же самое DynamicResource
. Единственное отличие состоит в том, что StaticResource
указывает синтаксическому анализатору XAML разрешить ссылку на ресурс во время компиляции, тогда как DynamicResource
позволяет анализатору XAML создать вместо этого выражение, которое будет оцениваться во время выполнения. DynamicResource
поэтому разрешает ресурс во время выполнения.