이 문제를 해결하기위한 핵심 아이디어는 트리 수준이 아닌 각 노드 내에서 변경된 이벤트를 검색하는 것입니다. 노드가, 헤더가 DisconnectedItem라는 감시 객체로 설정됩니다 제거되고 항목 변경 이벤트를 받았을 때
나는 상속 트 리뷰
protected override DependencyObject GetContainerForItemOverride()
{
return new MultiSelectTreeViewItem();
}
protected override bool IsItemItsOwnContainerOverride(object item)
{
return item is MultiSelectTreeViewItem;
}
에서 TreeViewItem
클래스
public class MultiSelectTreeViewItem : TreeViewItem
{
object _originalHeader;
protected override void OnHeaderChanged(object oldHeader, object newHeader)
{
base.OnHeaderChanged(oldHeader, newHeader);
//.NET 4.5 use BindingOperations.DisconnectedSource
if (newHeader.ToString() != "{DisconnectedItem}")
_originalHeader = newHeader;
}
protected override void OnItemsChanged(NotifyCollectionChangedEventArgs e)
{
base.OnItemsChanged(e);
if (Header.ToString() == "{DisconnectedItem}" && _originalHeader != null && e.Action == NotifyCollectionChangedAction.Reset)
{
//Find the parent Tree View and remove this from MultiSelectedList
}
}
protected override DependencyObject GetContainerForItemOverride()
{
return new MultiSelectTreeViewItem();
}
protected override bool IsItemItsOwnContainerOverride(object item)
{
return item is MultiSelectTreeViewItem;
}
}
을 상속 NotifyCollectionChangedAction.Reset
이됩니다.
List.Clear()
을 입력 한 경우 NotifyCollectionChangedAction.Remove
이벤트는 실행되지 않으며, 단지 NotifyCollectionChangedAction.Reset
이됩니다. 그래서 나는 그것이 노드 제거를 감지하는 가장 신뢰할 수있는 방법이라고 생각합니다.
노드 하나가 렌더링되지 않은 경우 (부모가 확장되지 않은 경우)이 이벤트는 실행되지 않습니다.
언급 한대로이 방법은 일반적인 의미의 솔루션이 아니며 많은 중요한 오류의 경우가 많습니다. 나는 이전의 대답을 따르는 것이 좋습니다. –
@AndrewHanlon 내가 더 잘 이해할 수 있도록 예제를 사용 하시겠습니까? – Steve