0

我有一个DataTemplate正在加载一个列表中 ~7000 个项目的列表combobox。当前ItemsSource绑定到 的数据上下文中的一个属性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

在我看来,解决这个问题的理想方法是在DataContextCombobox 绑定的 Window 的 /VM 中拥有一个属性。这可能吗?就像是:

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

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

3 回答 3

2

减速在哪里?

如果是当您显示 ComboBox 的弹出窗口时,也许您可​​以尝试像这样使用虚拟化:

<DataTemplate>          
    <ComboBox SelectedItem="{Binding SelectedItem}" ItemsSource="{Binding ItemsSource}">
        <ComboBox.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel />
            </ItemsPanelTemplate>
        </ComboBox.ItemsPanel>
    </ComboBox> 
</DataTemplate>
于 2013-09-27T09:32:41.200 回答
1

为您的窗口或曾经控制所有组合框的东西创建一个 MainViewModel ,

CS:

 public class MainViewModel
 {
    private List<object> _itemsSource;

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

xml:

       <DataTemplate>
            <ComboBox SelectedItem="{Binding SelectedItem}" 
                  ItemsSource="{Binding Path=DataContext.ItemsSource,
                                 RelativeSource={RelativeSource AncestorType=ItemsControl}}"/>
       </DataTemplate>
于 2013-09-27T09:53:55.133 回答
0

如果您在 VM 中定义了属性,那么当您将其实例化并用作所有组合框的源时,它将只加载一次。不是每个组合框都创建它的 itemsSource.. 它只是消耗它来生成它的项目..因此,无论您将 itemsSource 作为 Resource 还是在 Datacontext 中都是一回事。

于 2013-09-27T09:27:17.970 回答