¿Tiene algo así como una propiedad booleana en su fuente de llama HasDetails
o algo? En ese caso, puedes usar algo como esto. Cree un MultiDataTrigger en el ItemContainerStyle que enlaza a HasDetails
en el DataContext y IsSelected
para el TreeViewItem
y si ambos son verdaderos (bueno, es cierto que HasDetails es falso :-), inicia un Storyboard que "anula la selección" del TreeViewItem
recientemente seleccionado.
Esto deshabilitará la selección de todos los TreeViewItem
que no tienen detalles pero que aún serán expandibles. Es de esperar que era lo que estaba buscando
<TreeView ...>
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding HasDetails}" Value="False"/>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True"/>
</MultiDataTrigger.Conditions>
<MultiDataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<BooleanAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetProperty="(TreeViewItem.IsSelected)">
<DiscreteBooleanKeyFrame KeyTime="00:00:00" Value="False"/>
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</MultiDataTrigger.EnterActions>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
actualización
Para desactivar las TreeViewItem
's donde HasDetails es falso puede utilizar esta
<TreeView ...>
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsEnabled" Value="{Binding HasDetails}"/>
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
¿Por qué no mostrar un mensaje como "No hay detalles disponibles" al seleccionar esos nodos? Hacerlos no seleccionables no es muy consistente con la funcionalidad de un TreeView. Si un usuario hace clic en un nodo y ese nodo no se selecciona, su primera idea será que el clic se perdió (sin comentarios visuales de su acción). Sin mencionar que es mucho más fácil de implementar. –