2010-01-20 6 views
2

트리 컨트롤에서 인덱스 항목을 가져 오기 및 Adobe의 빠른 시작의 도움 사용하여 나무에 드롭 조작 :내가 드래그를하고 있어요

var dropTarget:Tree = Tree(evt.currentTarget); 
var i:int = dropTarget.calculateDropIndex(evt); 
myTree.selectedIndex = i; 
var node:XML = myTree.selectedItem as XML; 
var drugXML:XML = XML(Tree(evt.dragInitiator).selectedItem); 
if(node.localName() != drugXML.localName()){ 
    DragManager.showFeedback(DragManager.NONE); 
    return; 
}else{ 
    DragManager.showFeedback(DragManager.COPY); 
} 
: http://www.adobe.com/devnet/flex/quickstart/working_with_tree/

제안 코드는 대략적입니다

이것은 모두 훌륭하고 훌륭하지만, 떨어지는 트리의 각 항목을 선택 (강조 표시)하는 방식이 마음에 들지 않습니다. 항목을 삭제할 위치가 명확하지 않습니다. 선택없이 이것을 구현하고 싶지만 색인만을 사용하여 노드의 XML을 가져 오는 방법이없는 것 같습니다. ~

var dropTarget:Tree = Tree(evt.currentTarget); 
var i:int = dropTarget.calculateDropIndex(evt); 

var node:XML = myTree.itemAt(i) as XML; 
//AFAIK itemAt(i) or anything like it does not exist 

var drugXML:XML = XML(Tree(evt.dragInitiator).selectedItem); 
if(node.localName() != drugXML.localName()){ 
    DragManager.showFeedback(DragManager.NONE); 
    return; 
}else{ 
    DragManager.showFeedback(DragManager.COPY); 
} 

그래서 누군가가 무엇인지 기능을 알 수 있습니까, 아니면이 기능을 가지고 트리를 확장하기 위해 무엇을 할 수 있는지, "itemAt (I)"

감사 을 같은 : 나는 이런 식으로 뭔가를 싶습니다 마이크

편집 : 내 현재 해결책은 내 노드 XML을 얻은 후에 selectedIndex = -1로 설정하는 것을 게시하는 것을 잊어 버렸습니다. 프로세서에 문제가 발생하면 사용자가 볼 수 있으므로 선택을 취소하는 것이 좋습니다.

+0

단일 스레드에 머물러 있고 (validateNows를 트리거하지 않는 한) 시각적 피드백으로부터 안전하다고 생각합니다. Flex 프레임 워크는 UIComponents를 업데이트 할 기회를 얻지 못합니다. –

+0

다른 사람들이 스레드를 참조하는 것을 보았습니다. 어떤 의미인지는 모르겠지만이 의미에서 스레드는 무엇이며 다른 스레드를 생성하는 방법은 무엇입니까? 나는 다른 질문을 게시 할 것입니다 ... – invertedSpear

답변

2

훨씬 간단, 개는있을 수 있지만 :

var index:int = ... 
var renderer:IListItemRenderer = tree.indexToItemRenderer(index); 
var item:Object = renderer.data; 

(활성의 itemRenderer이되지 않을 수도 있기 때문에) 인덱스가 오프 스크린 경우이 작동하지 않습니다; 드래그 앤 드롭에 문제가 있어서는 안됩니다.

+0

시도해 주셔서 감사합니다. 그래서 열심히, 나무에 대한 itemRendererToItem 메소드가 없습니다. itemRendererToIndex를 할 수 있습니다. 그렇지만 우리가 바로 시작한 곳 :-) – invertedSpear

+0

미안합니다 - itemRenderer가 이미 데이터를 소유하고 있고, aToB 함수가 필요하지 않습니다. –

+0

Y 찬성! 최신 편집 작품! 감사합니다 마이클, 우리는 당신과 같은 사람들을 사기 위해 인사를 교환 할 수 있어야합니다. – invertedSpear

0

dataProvider이 명시 적 또는 암시 적으로 모음 (변환 규칙에 대한 링크 된 문서 참조) 인 경우 getItemAt을 사용하여 색인을 해결할 수 있어야합니다.

그것은이 XML 공급자가 암시 적으로 변환 할 것으로 보인다 : 당신이 전환 유형 (XML, 배열 등)이 아닌 다른이있는 경우

var tree:Tree = ...; 
var data:XML = ...; 
tree.dataProvider = data; // could just as well be from MXML 

var provider:ICollectionView = tree.collection; // tree converted it for us 
trace(provider.getItemAt(index)); 

, 당신은 포장 고려해 볼 수 있습니다 귀하의 XMLListCollectiondataProvider 또는 그 방법에 접근하려면 무엇을해야합니까?


위의 내용은 올바른 방향을 목표로하고 있습니다.

Tree이 우선 적용되지 않으므로 원하지 않습니다. collection 속성 (보호됨)이 필요합니다. 따라서 Tree에 이미있는 thisToThat 메서드를 사용하여 Tree를 재정의하고 indexToItem 메서드를 제공 할 수 있습니다.

+0

내 dataProvider는 XML 유형입니다. 나는 그것을 XMLListCollection으로 만들었을 때 내 앱의 나머지 부분에서 문제가 발생했다. – invertedSpear

+0

Flex가 XML을 컬렉션으로 변환하는 방법에 대한 몇 가지 노트를 추가했습니다. –

+0

나는 당신이 제안한 것을 시도했다. 그것은 getItemAt()가 ICollectionView의 메소드가 아니라는 것을 말해 준다. 그래서 나는 단지 "추적 (나무."docProcessor.getItemAt (i))"문서에서 자동으로 목록 컬렉션으로 변환되었다고했기 때문에 문제가 없어야합니다. 코드를 실행하면 인덱스가 범위를 벗어났다는 내용의 충돌이 발생합니다. 스레드에 대한 몇 가지 좋은 대답이 있습니다. 그래서 적어도 질문에 대한 의견에서 당신이 말한 내용에 능숙하다는 것을 알고 있습니다. – invertedSpear

관련 문제