2011-08-31 95 views
3

在我的視圖模型中,我有兩個相關的屬性。他們的實現是這樣的:爲什麼我的ComboBox在Visual Studio中運行我的程序時需要很長時間才能下載?

public string Code 
{ 
    get { return _Code; } 
    set 
    { 
     if (_Code != value) 
     { 
     _Code = value; 
     OnPropertyChanged("Code"); 
     OnPropertyChanged("RelatedCodeList"); 
     } 
} 

public List<Code> RelatedCodeList 
{ 
    get 
    { 
     return CodeLists[Code]; 
    } 
} 

CodeListsDictionary<string, List<Code>>

我有一個ComboBox這是綁定到RelatedCodeList;它的實現看起來像這樣:

<ComboBox SelectedItem="{Binding RelatedCode, Mode=TwoWay}" 
      ItemsSource="{Binding RelatedCodeList}"> 

這似乎很簡單,它的工作原理除一件事外。當我在UI中更改Code,然後單擊組合框時,需要兩或三秒才能下拉。即使列表中的項目少於10個。

這是什麼原因造成的?這不是收集更改事件:List不實施INotifyCollectionChanged,並且無論如何收集沒有改變。它似乎沒有發生在視圖模型內部;我已經將斷點放入屬性獲取器中,只要屬性更改事件發生,獲取器就會中斷;當組合框下降時它們不會被調用。它似乎不是項目呈現:沒有爲Code類定義數據模板,並且該類中的ToString()的實現是微不足道的。

我在忽略什麼?

編輯

我跟進威爾的建議,並發現這種情況不會發生,除非我在調試器下運行。如果我只是運行可執行文件(即使是Debug版本),它也能正常運行。

因此,爲了使這個問題真正有用,我們來對其進行修改:爲什麼會發生這種情況?而且,更重要的是,如果調試器應該受到指責,我是否有任何方法可以告訴調試器將事物混亂起來,這樣我就不會花幾個小時試圖找出實際上不存在的問題的原因?

+0

任何在輸出窗口可疑?之前我遇到過這樣的事情,我認爲這與UI-Automation拋出無例外的異常有關。如果你可以發佈一些獨立的代碼來重現問題,那將會很有幫助。 –

+0

在RelatedCode的get或set方法中是否有任何相關的代碼?你有沒有嘗試刪除SelectedItem綁定? – grantnz

+0

「RelatedCodeList」集合中有多少項?輸出窗口中是否有任何'BindingErrors'? – Dennis

回答

0

這種類型的問題真的很難回答,因爲您沒有真正提供足夠的信息。您提供的任何內容都可能導致此問題。

但是使用我驚人的演繹力量,我會建議你檢查一下你沒有發生任何循環的OnPropertyChanged調用 - 我注意到這些可以阻止調試器,但是幾乎沒有人注意到它。

否則,請檢查您的CodeLists索引器。

+0

我同意我提供的任何內容都不應引起此問題。但我找不到其他東西。 'CodeLists'是一個'Dictionary ',所以它的索引器是(除非發生什麼*非常奇怪的事情)就好了。我把一個監聽器連接到了PropertyChanged事件上,也沒有任何異常情況發生。 –

0

我發現WPF ComboBox缺乏Virutal Stack Panel,它使UI渲染速度變慢。包括虛擬堆棧面板是一個完美的解決方案。

包括以下到窗口/用戶控制資源

<ItemsPanelTemplate x:Key="VSP"> 
    <VirtualizingStackPanel/> 
</ItemsPanelTemplate> 

更新組合框XAML -

<ComboBox ItemsSource="{Binding Path=MyDataSource}" DisplayMemberPath="Name" SelectedValuePath="Id" ItemsPanel="{StaticResource VSP}"/> 
相關問題