我有一個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>
帶有7000個項目的組合框通常不是要走的路,你可以在輸入時使用類似文本框的下拉建議。 – Schwarzie2478
如果你有VM中定義的屬性,那麼這將只加載一次,並作爲所有組合框的源代碼..不是每個組合框都不會創建它的itemsSource ..它只是消耗它來生成它的項目.. – Nitin
as i瞭解它每個組合框有它自己的虛擬機.. 所以在每個虛擬機中你需要填充整個ItemSource .. 爲什麼不使用全局存儲庫,一個持有集合綁定的靜態類,我理解了正確的情況嗎? –