Я нашел проблему. Привязка непрозрачности не работала, но происходило то, что кнопка отключала себя на основе предиката, который я установил в RelayCommand. Это выглядело как эффект, который я хотел, но влиял только на нажатие кнопки, потому что каждая кнопка была связана с отдельной ICommand.
Я изменил его, чтобы удалить изменение привязки из OpacityProperty к IsEnabledProperty, и удалил предикат из объявления RelayCommand. Теперь все работает как задумано.
Я не знаю, почему кнопка изменилась бы на отключенное представление, когда она проверяет предикат (и находит его ложным), но никогда не изменится обратно, если условие изменится. Одд.