Есть ли в вашем источнике что-то вроде логического свойства с именем 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>
Обновление
Чтобы отключить TreeViewItem
, где HasDetails имеет значение False, вы можете использовать это
<TreeView ...>
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsEnabled" Value="{Binding HasDetails}"/>
</Style>
</TreeView.ItemContainerStyle>
</TreeView>