WPFTreeViewに大きな問題があります。これに似たツリーを設定しました。
<TreeView DataContext="{Binding Projects}">
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="True" />
</Style>
<TreeView.Resources>
<HierarchicalDataTemplate x:Key="LoadTemplate">
<Grid>
<TextBlock Text="{Binding Name}" />
</Grid>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="StepTemplate"
ItemsSource="{Binding Loads}"
ItemTemplate="{StaticResource LoadTemplate}">
<Grid>
<TextBlock Text="{Binding Name}" />
</Grid>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="ProjectTemplate"
ItemsSource="{Binding Steps}"
ItemTemplate="{StaticResource StepTemplate}">
<Grid>
<TextBlock Text="{Binding Name}" />
</Grid>
</HierarchicalDataTemplate>
</TreeView.Resources>
<TreeViewItem Header="Project Workspace"
ItemsSource="{Binding}"
IsExpanded="True"
ItemTemplate="{StaticResource ProjectTemplate}" />
</TreeView>
TreeViewは、xamlの分離コードファイル内のObservableCollectionであるProjectsと呼ばれるDependencyPropertyにバインドされています。ツリーがバインドされているクラスの基本構造は、ツリーの構造に従います。したがって、Projectには、INotifyPropertyChangedインターフェイスとICollectionChangedインターフェイスの両方を実装するカスタムコレクションが含まれています。そのコレクションには、Stepsというプロパティからアクセスでき、Stepオブジェクトが含まれています。Stepクラスには、Loadsというプロパティからアクセスできる同じカスタムコレクションのインスタンスもあり、Loadオブジェクトが含まれています。
これで、プロジェクト内の任意のオブジェクトを操作すると、ネストされたコレクションのセットが変更されると、ノードが表示および非表示になり、正しく変更されるという点で、ツリーが正しく動作します。ほとんどの場合、すべてが正常に機能します。
上記のXamlには表示していませんが、上記の各ノードには独自のコンテキストメニューが追加されています。そのコンテキストメニューのオプションの1つは、オブジェクトを追加することです。したがって、たとえば、ステップノードを右クリックすると、その下にロードノードを追加するオプションがあります。StepオブジェクトのLoadsプロパティにLoadクラスを追加すると、ノードがツリーに正常に表示されます。
たとえば、コードは次のようになります。
Projects[0].Steps[0].Loads.add(new Load());
さて、これが私が今最も長い間理解しようとしてきた問題です。その新しいノードがツリーに表示されると、その親ノードは選択できなくなります。したがって、与えられた例では、新しく追加されたロードノードを所有するステップノードを選択することはできません。次にDoubleClickやRightClickなどを実行してイベントを発生させることはできますが、マウスの左ボタンでシングルクリックするだけでは、ステップノードが選択されたりフォーカスが移動したりすることはありません。私は考えられるすべてのことを試みました、そして私は私の人生のためになぜそうしないのか理解することができません。
これで、ツリー内の他のノードをクリックすることができ、それらは問題なく選択できます。そして、そうすると、以前は選択できなかったノードが以前の機能に戻り、再び選択できるようになります。
つまり、新しいノードを追加すると、そのノードが表示され、TreeViewの他の部分を選択するまでその親を選択できなくなり、すべてが再び正常になります。