вот решение, которое сработало для меня.
я удалил все свойства, которые устанавливают видимость деталей (чтобы все оставалось по умолчанию)
добавлен следующий стиль
<Style x:Key="VisibilityStyle" TargetType="{x:Type DataGridRow}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Visible}" Value="False">
<Setter Property="DetailsVisibility" Value="Collapsed" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=Visible}" Value="True">
<Setter Property="DetailsVisibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
назначил этот ресурс RowStyle
в своем базовом объекте данных я добавил свойство Visible и реализовал интерфейс INotifyPropertyChanged.
Теперь, когда я хочу показать / скрыть детали, я просто манипулирую свойством Visible моего базового объекта. это может происходить от обработчика кнопки столбца до любого другого места в моем коде. прекрасно работает