У вас есть что-то вроде Логическое свойство в источнике называется HasDetails
или что-то? В этом случае вы можете использовать что-то вроде этого. Создайте MultiDataTrigger в ItemContainerStyle, который связывается с HasDetails
в DataContext и IsSelected
для TreeViewItem
, и если оба значения True (ну, True, что HasDetails False :-), вы запускаете раскадровку, которая «отменяет» выбранный TreeViewItem
.
Это отключит выбор для всех TreeViewItem
, у которого нет деталей, но они по-прежнему будут расширяемы. Надеюсь, что это то, что вы искали
<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>
Update
Чтобы отключить TreeViewItem
«S, где HasDetails ложна вы можете использовать этот
<TreeView ...>
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsEnabled" Value="{Binding HasDetails}"/>
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
Почему бы не просто показать сообщение «Сведения не доступны» при выборе этих узлов? Если они не поддаются выбору, это не очень соответствует функциональности TreeView. Если пользователь нажимает на узел и этот узел не выбирается, его первая идея будет заключаться в том, что щелчок был потерян (нет визуальной обратной связи его действия). Не говоря уже о том, как проще реализовать. –