Я бы сделал это в моей модели зрения. Модель представления для предметов уровня 0 будет иметь:
public bool IsSelected
{
get { return false; }
set
{
// error checking is omitted
Children[0].IsSelected = value;
// let WPF know that IsSelected may have changed from what it's expecting
this.Dispatcher.BeginInvoke((ThreadStart)delegate
{
this.OnPropertyChanged(() => this.IsSelected);
});
}
}
Ваш XAML будет выглядеть так:
<TreeView>
<TreeView.ItemContainerStyle>
<Style TargetType="TreeViewItem">
<Setter Property="IsSelected" Value="{Binding IsSelected}"/>
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
Теперь, когда пользователь нажимает на элемент первого уровня, виртуальная машина будет отказываться от выбора и вместо этого выбирает свой первый дочерний элемент.
Вы можете использовать точно такую же технику, чтобы справиться с вашими требованиями на всех уровнях.