2010-10-30 24 views
0

我有一個WPF(.Net 4)ListView用於導航本地Windows目錄。它顯示當前目錄的內容,名稱和大小以及所有內容。但是,在某些目錄中,它顯示的第一個元素顯示兩次。例如,在目錄「D1」中,我有子目錄「W」,「X」,「Y」和「Z」。儘管綁定的實際數據(一個ThreadObservableCollection)沒有重複,但ListView會說「W W X Y Z」。當包含它的對象被創建時,ThreadObservableCollection最初是空的,在後臺線程上找到子目錄和文件,然後將它們放入集合中。數據綁定ListView中的第一項有時會被複制?

我不知道如何調試,因爲它純粹出現在演示區域,我擔心它可能是框架本身的錯誤。它不會出現在每個目錄中,但似乎(某種程度上)是可重複的,但它確實存在某種模式,儘管我尚未找到任何顯着的特徵。如果它確實發生,它也總是第一個入口。

我也嘗試過監聽ThreadObservableCollection的CollectionChanged事件,但它只會在每個項目發生變化時觸發一次,我會看到提供的值以確保沒有重複項(它們沒有重複項) T)。

我還附加了一個DebugConverter(見下文)TextBlock包含所示的(子)目錄的名稱,它確實顯示重複的值。所以在ListView中肯定有兩個實際的行,後面跟着相同的項目,但我仍然不知道爲什麼。

我很感激任何可能出錯或甚至如何嘗試找出它認爲它必須複製第一個條目的建議。

回答

1

我可能會先通過一個DebugConverter運行它(你必須寫它,我不認爲有一個與.Net發佈的實現)。它看起來像這樣:

(很明顯,在VS中用方法中的單行代碼粘住你的斷點)。

public class DebugConverter : IValueConverter { 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return value;  
    } 
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return value; 
    } 
} 

現在你可以在斷點處插入一個斷點,並驗證重複實際上是在接口生成級別上升。檢查文件的絕對路徑(例如,它是表示當前目錄的默認路徑「。」,或者類似的東西?是否是其他地方的錯誤轉換?我不知道爲什麼只會發生在某些目錄中,但是從廣泛的調試網開始)。

這可能不是一個線程問題,因爲我心中的調度控制與UI的所有互動,包括它備份你的觀點,這意味着它只能交互連續的的ObservableCollection。但是,如果你不使用ObservableCollection,你可能會使用線程?我懷疑WPF對任何支持枚舉都相當嚴格,但我不確定。哦,等等,你說你在使用ObservableCollection。好的,不能穿線。你是否對DataTemplateSelector有興趣?是否有適用視圖模板的樣式?你可以有兩種應用樣式和包括另一個視圖項的觸發默認二傳手?

讓我們嘗試硬如我們不能假設它是在框架中的一個錯誤。根據我的經驗,問題始終是我的代碼,即使我不覺得它可能在前面。

(發表評論)

即使你的收集是空在約束力的時候,你應該能夠爲他們去這樣來訪問單個元素:

<ListView> 
<ListView.ItemTemplate> 
    <DataTemplate> 
    <TextBlock Text='{Binding Path=filename, Converter={StaticResource DebugConverter}' /> 
    ...etc 
    </DataTemplate> 
</ListView.ItemTemplate> 
</ListView> 

任何機會,你可以發表你的碼?

+0

首先,謝謝!按照粗略的順序提到它:ValueConverter有一個好主意,我希望我能想到,但綁定時的實際集合是空的 - 事物在後臺加載,然後集合告訴ListView進行更新。沒有DataTemplateSelector,沒有觸發器會影響ListView中的任何內容,除非我完全忘記了自己的代碼。有後臺線程,是的,但無論如何WPF中無法觸及UI;只有一個發現目錄/文件放在列表中。 – JustABill 2010-10-31 01:11:33

+0

回覆後評論編輯:這裏的代碼相當複雜;發佈整個相關部分將採取頁面和頁面。有沒有你感興趣的特定部分? ListView的定義還是什麼?但我會嘗試TextBlock調試轉換器。 – JustABill 2010-10-31 17:35:07

+0

顯然我不能編輯該評論,所以我只是試過。它確實顯示重複,至少證實有兩個獨特的TextBlocks由於某種原因被附加到相同的項目。所以在集合和ListView之間的某個地方它會被重複。 – JustABill 2010-10-31 17:41:25

相關問題