オブジェクト ツリーにバインドされたツリービューがあります。オブジェクト ツリーからオブジェクトを削除すると、ツリー ビューから正しく削除されますが、ツリー ビューのデフォルトの動作では、選択した項目が削除された項目の親ノードにジャンプします。代わりに次の項目にジャンプするようにこれを変更するにはどうすればよいですか?
編集:
Aviad の提案でコードを更新しました。これが私のコードです..
public class ModifiedTreeView : TreeView
{
protected override void OnItemsChanged(NotifyCollectionChangedEventArgs e)
{
base.OnItemsChanged(e);
if (e.Action == NotifyCollectionChangedAction.Remove)
{
if (e.OldStartingIndex - 1 > 0)
{
ModifiedTreeViewItem item =
this.ItemContainerGenerator.ContainerFromIndex(
e.OldStartingIndex - 2) as ModifiedTreeViewItem;
item.IsSelected = true;
}
}
}
protected override DependencyObject GetContainerForItemOverride()
{
return new ModifiedTreeViewItem();
}
protected override bool IsItemItsOwnContainerOverride(object item)
{
return item is ModifiedTreeViewItem;
}
}
public class ModifiedTreeViewItem : TreeViewItem
{
protected override void OnItemsChanged(NotifyCollectionChangedEventArgs e)
{
base.OnItemsChanged(e);
if (e.Action == NotifyCollectionChangedAction.Remove)
{
if (e.OldStartingIndex > 0)
{
ModifiedTreeViewItem item =
this.ItemContainerGenerator.ContainerFromIndex(
e.OldStartingIndex - 1) as ModifiedTreeViewItem;
item.IsSelected = true;
}
}
}
protected override DependencyObject GetContainerForItemOverride()
{
return new ModifiedTreeViewItem();
}
protected override bool IsItemItsOwnContainerOverride(object item)
{
return item is ModifiedTreeViewItem;
}
}
上記のコードは、デバッグするか、何らかの方法で OnItemsChanged メソッドを遅くしない限り機能しません。たとえば、OnItemsChanged メソッドの最後に thread.sleep(500) を配置すると機能しますが、それ以外の場合は機能しません。私が間違っていることは何か分かりますか?これは本当に奇妙です。