我有一个 DataTemplate
正在为 combobox
加载列表中约 7000 个项目的列表.目前ItemsSource
绑定(bind)到 DataTemplate
的数据上下文中的属性,然而这意味着对于 DataTemplate
的每个实例系统正在加载所有 7k 对象,这大大降低了系统速度。
理想情况下,我希望能够一次加载列表并将其用于所有实例。对我来说显而易见的解决方案是使用 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
在我看来,解决这个问题的理想方法是在
DataContext
中拥有一个属性。他们Combobox也绑定(bind)的Window的/VM。这可能吗?就像是:public class WindowsViewModel
{
public List<Object> SharedItemSource { get; set; }
}
<DataTemplate>
<ComboBox SelectedItem="{Binding SelectedItem}" ItemsSource="{Binding <Some Binding To SharedItemSource>}" />
</DataTemplate>
最佳答案
减速在哪里?
如果是当您显示 ComboBox 的弹出窗口时,也许您可以尝试像这样使用虚拟化:
<DataTemplate>
<ComboBox SelectedItem="{Binding SelectedItem}" ItemsSource="{Binding ItemsSource}">
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</ComboBox.ItemsPanel>
</ComboBox>
</DataTemplate>
关于c# - 在带有 MVVM 的 DataTemplate 中使用窗口资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19047062/