我有一个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

我认为解决此问题的理想方法是在Combobox绑定(bind)的Window的DataContext/VM中拥有一个属性。这可能吗?就像是:
public class WindowsViewModel
{
     public List<Object> SharedItemSource { get; set; }
}

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

最佳答案

为您的窗口或控制所有组合框的窗口创建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>

关于c# - 在带有MVVM的DataTemplate中使用窗口资源,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19047062/

10-11 16:01