Вам не нужен ControlTemplate для этого. Вы можете сделать это с помощью только стилей. Следующий стиль кнопки применяется ко всем кнопкам. Устанавливает непрозрачность на 0,5, когда IsEnabled равно true, и возвращает его на 1 автоматически, когда условие триггера больше не применяется. Если вы применяете ControlTemplate в стиле, вы можете добавить этот триггер к этому. Это также работает, когда родительский элемент отключен, поскольку IsEnabled наследуется.
<Window.Resources>
<Style TargetType="{x:Type Button}">
<Style.Triggers>
<Trigger Property="Control.IsEnabled" Value="false">
<Setter Property="Control.Opacity" Value="0.5" />
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
Или вам конкретно требовалось решение ControlTemplate?
Обновление
Я не думаю, что TemplateBinding поддерживает Converter, поэтому, если вы хотите сделать это в ControlTemplate, вам нужно использовать что-то вроде следующего оператора Binding достаточно высоко в логическом дереве.
Opacity={Binding Path=IsEnabled,
RelativeSource={RelativeSource TemplatedParent},
Converter={StaticResource BoolToDoubleConverter}}
Где BoolToDoubleConverter - это IValueConverter, который возвращает 1 для true и 0.5 для false. Я все еще рекомендую подход стиля, если вы можете использовать стили. Гораздо проще, я верю.