2010-01-20 67 views
2

我做一拖,並使用Adobe公司的快速啓動一些幫助在樹上拖放操作: http://www.adobe.com/devnet/flex/quickstart/working_with_tree/獲取項目

建議的代碼大致是這樣的:

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); 
} 

這一切都很好,但我不喜歡它選擇(突出顯示)我正在放置的樹中的每個項目的方式,它不太清楚項目將放置在哪裏。我想在沒有選擇的情況下實現它,但似乎沒有辦法只使用索引來獲取節點的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)」

感謝 〜 Mike

編輯:我忘了發佈我目前的解決方法是在獲取我的節點:XML後設置selectedIndex = -1。我擔心,如果處理器上出現問題,用戶可能會看到它,然後取消選擇。

+0

只要你停留在單線程中(並且不觸發任何validateNows),我認爲你對視覺反饋是安全的--Flex框架將不會有機會更新UIComponent。 – 2010-01-20 18:49:50

+0

我已經看到其他人提到線索,我不知道他們指的是什麼,在這個意義上什麼是線程,我將如何產生另一個,或確保我只在一個?我要發佈另一個問題... – invertedSpear 2010-01-20 19:41:54

回答

2

簡單得多,雖然可能有陷阱:

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

如果索引屏幕之外(因爲有可能不是一個積極的itemRenderer),這將無法正常工作;不應該是拖放的問題。

+0

感謝您嘗試所以很難,沒有itemRendererToItem方法的樹,我可以做itemRendererToIndex,但是我們馬上就回到了我們開始的地方:-) – invertedSpear 2010-01-20 23:43:48

+0

抱歉 - itemRenderer已經擁有數據,不需要aToB函數。 – 2010-01-21 01:06:45

+0

Y AY!最新的編輯作品!謝謝邁克爾,我們應該能夠通過代理交易來購買啤酒等人。 – invertedSpear 2010-01-21 15:52:28

0

如果您的dataProvider是明確或隱含的集合(請參閱轉換規則的鏈接文檔),您應該能夠使用getItemAt來解析索引。

看來,一個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)); 

如果您有可轉換類型(XML,陣列等),其他的東西,你可能會考慮您的包裹在dataProviderXMLListCollection或你有什麼獲得該方法的途徑。


以上是針對正確的方向,但失蹤。

原來你不希望dataProviderTree覆蓋那個;你想要collection屬性(受保護)。因此,您可以覆蓋樹並提供indexToItem方法,以使用Tree中已有的thisToThat方法。

+0

我的dataProvider是一個XML類型。我遇到了問題(可能是我自己缺乏技能),使其與我的應用程序的其餘部分一起工作時,我將它作爲XMLListCollection。 – invertedSpear 2010-01-20 19:39:26

+0

添加了一些關於Flex如何將XML轉換爲集合的註釋。 – 2010-01-20 20:24:06

+0

我嘗試了你的建議,它告訴我getItemAt()不是ICollectionView的一個方法。所以我只是做了「追蹤(樹。dataProvider.getItemAt(i))「,因爲文檔說它被自動轉換爲列表集合,這應該是沒有問題的。當我運行代碼時,它崩潰,說索引超出範圍。爲什麼會這樣?關於線程的一些很好的回答,所以至少我知道我對你在這個問題的評論中說的很好。 – invertedSpear 2010-01-20 21:46:37