2013-01-09 27 views
0

我是C#和WPF編程的初學者,我正在創建一個文件管理器,其中包含所有項目都被限制的2 ListView。在ListView有一些GridViewColumn s和第一個有CellTemplate因爲我想那裏圖標的文件/文件夾及其名稱。該CellTemplate是:在ObservableCollection調用中編輯listView項目XamlParseException(需要DependencyObject) - WPF

<DataTemplate x:Key="IconTemplate"> 
      <Grid> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="auto"/> 
        <ColumnDefinition/> 
       </Grid.ColumnDefinitions> 
       <Image Source="{Binding Path=itemIcon}" Width="20" Grid.Column="0"/> 
       <TextBlock Grid.Column="1" Text="{Binding Path=itemName}" /> 
      </Grid> 
     </DataTemplate> 

而且我有一個類:所有的目錄和文件被添加到集合,併爲每個文件的ObservableCollection它的圖標從文件轉換。 MyItem類包含名稱,擴展名等幾個字符串以及一個用於這些圖標的ImageSource。所有的工作都很好,直到我意識到由於轉換這些圖標,一些帶有不同文件的文件夾會凍結程序。所以現在我爲每個文件綁定一些通用圖標,然後我想在另一個線程中進行轉換和更改。所以在主類我創建全球ObservableCollection項目,因爲我不知道如何從列表視圖加載他們回來我已經將填充集合功能從Observable-class移動到主類。現在我可以在新線程中更改listview中的項目,但是 - 終於出現了我的問題 - 我得到XamlParseException - 必須在與DependencyObject相同的線程上創建DependencySource。當我試圖改變文件的名稱(字符串),它完美的工作(到目前爲止,我只在按鈕點擊測試它)!根據我在互聯網上找到的一些參考,我嘗試將dependencyObject實現到MyItem類,但它沒有奏效。這個改變的圖標功能。

for (int i = leftDirectories.Length; i < (leftDirectories.Length + leftFiles.Length); i++) 
     { 
      FileToImageIconConverter some = new FileToImageIconConverter(locationLeft + leftFiles[i - leftDirectories.Length].Name); 
      ImageSource imgSource = some.Icon; 
      leftFilesLoad[i].itemIcon = imgSource; 
      this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate() 
        { 
         contentLeft.Items.Refresh(); 
        } 
      ); 

很長的文章,stackoverflow說具體:-D。非常感謝大家幫助我。我期待着您的回覆,我準備向您展示您需要的所有代碼。

回答

1

發生異常是因爲您在非UI線程上創建了ImageSource。除非你凍結對象,否則你不能這樣做。您將希望所有與UI相關的邏輯都包含在您的BeginInvoke調用中。試試這個代替

for (int i = leftDirectories.Length; i < (leftDirectories.Length + leftFiles.Length); i++) 
{ 
      this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate() 
      { 
       FileToImageIconConverter some = new FileToImageIconConverter(locationLeft + leftFiles[i - leftDirectories.Length].Name); 
       ImageSource imgSource = some.Icon; 
       leftFilesLoad[i].itemIcon = imgSource; 
       contentLeft.Items.Refresh(); 
      } 
    ); 
} 

這應該保持UI線程上的所有UI相關的活動。

+0

是的,你說得對,我只好把leftFilesLoad [i] .itemIcon = imgSource;調度員功能。請問,是否有任何方式在c#中加載一些ObservableCollection變量中的項目從列表視圖? – Daniel

+0

@Daniel你想從「Listview」中取回項目嗎?如果你有一個對ListView的引用,你可以通過'ItemsSource'屬性獲得綁定項的集合。只需將其轉換爲適當的列表類型,然後您可以迭代它並將這些項目添加到其他'ObservableCollection'中。這是否回答你的問題? –