2013-09-27 60 views
0

我有一個DataTemplate,它在combobox的列表中加載一個〜7000項列表。目前ItemsSource綁定到DataTemplate的數據上下文中的屬性,但這意味着對於DataTemplate的每個實例,系統正在加載所有7k對象,這會使系統變慢一點。在MVVM中使用DataTemplate中的窗口資源

理想情況下,我希望能夠加載列表一次並將其用於所有實例。我明顯的解決方案是使用Window.Resources部分中定義的資源。然而,我無法弄清楚這應該如何工作,更重要的是,應該如何通過MVVM模式填充該資源。

其在解決問題加載ItemsSource每個DataTemplate例如

<DataTemplate>   
     <ComboBox SelectedItem="{Binding SelectedItem}" ItemsSource="{Binding ItemsSource}" />   
</DataTemplate> 

嘗試當前代碼:

<Window.Resources> 
    <ResourceDictionary>   
     <sys:Object x:Key="ItemItemsSource" /> 
    </ResourceDictionary> 
</Window.Resources> 

<DataTemplate>   
     <ComboBox SelectedItem="{Binding SelectedItem}" ItemsSource="{Binding Source={StaticResource ItemItemsSource}}" />   
</DataTemplate> 

更新

每個DataTemplate中都有自己的DataContext這意味着每個實例數據模板有它自己的ItemsSource,它將填充在DataContext初始值呃。

更新2

在我的腦海裏解決這個理想的辦法是在他們的ComboBox綁定過窗口的DataContext/VM的屬性。這可能嗎?喜歡的東西:

public class WindowsViewModel 
{ 
    public List<Object> SharedItemSource { get; set; } 
} 

<DataTemplate>   
    <ComboBox SelectedItem="{Binding SelectedItem}" ItemsSource="{Binding <Some Binding To SharedItemSource>}" />   
</DataTemplate> 
+0

帶有7000個項目的組合框通常不是要走的路,你可以在輸入時使用類似文本框的下拉建議。 – Schwarzie2478

+0

如果你有VM中定義的屬性,那麼這將只加載一次,並作爲所有組合框的源代碼..不是每個組合框都不會創建它的itemsSource ..它只是消耗它來生成它的項目.. – Nitin

+0

as i瞭解它每個組合框有它自己的虛擬機.. 所以在每個虛擬機中你需要填充整個ItemSource .. 爲什麼不使用全局存儲庫,一個持有集合綁定的靜態類,我理解了正確的情況嗎? –

回答

1

爲你的窗口創建MainViewModel或什麼都控制着所有的組合框的是,

CS:

public class MainViewModel 
{ 
    private List<object> _itemsSource; 

    public List<object> ItemsSource 
    { 
     get { return _itemsSource; } 
     set { _itemsSource = value; } 
    }     
} 

XAML:

 <DataTemplate> 
      <ComboBox SelectedItem="{Binding SelectedItem}" 
        ItemsSource="{Binding Path=DataContext.ItemsSource, 
           RelativeSource={RelativeSource AncestorType=ItemsControl}}"/> 
     </DataTemplate> 
+0

如果您在項目控件中使用它,請執行以下操作: AncestorType = ItemsControl –

+0

另外,您應該聽取flo的建議,並使用7000個項目的VirtualizingStackPanel –

+0

我已接受此答案,因爲它回答了我提出的問題,但是我已經使用了這個代碼和Flo的組合來解決這個問題。使用這個共享的ItemSource加載窗口的問題是固定的,但打開組合框時仍然有一個放緩的問題。 Flo的代碼解決了後一個問題。 –

0

如果您在VM定義的屬性,那麼就會加載只有一次,當你將其實例化並擔任源所有的組合框..不是每個組合框創建它的ItemsSource ..它只是消耗它來生成它的項目..所以無論你把你的itemsSource作爲資源或Datacontext在這裏是一樣的事情。

+0

DataTemplate的'DataContext'是不同的每行/ DataTemplate 。 –

2

速度在哪裏?

如果它是當你告訴組合框的彈出,也許你可以嘗試使用虛擬化這樣的:

<DataTemplate>   
    <ComboBox SelectedItem="{Binding SelectedItem}" ItemsSource="{Binding ItemsSource}"> 
     <ComboBox.ItemsPanel> 
      <ItemsPanelTemplate> 
       <VirtualizingStackPanel /> 
      </ItemsPanelTemplate> 
     </ComboBox.ItemsPanel> 
    </ComboBox> 
</DataTemplate> 
+0

減速是因爲當有10個「DataTemplate」實例時,加載了70,000個對象。 –

+0

你能解釋一下你的VM包含了什麼嗎? – Florent

+0

感謝您的回答弗洛,這確實幫助我最後 –