c# - 在带有 MVVM 的 DataTemplate 中使用窗口资源

标签 c# wpf mvvm

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

相关文章:

.net - XAML 中以逗号分隔的字符串形式的字符串数组

WPF MVVM - 绑定(bind)仅适用于初始值

xaml - 为什么要避免 WPF MVVM 模式中的代码?

c# - 在 C# 中,如何使用十六进制值创建 System.Drawing.Color 对象?

c# - 使用 System.Data.OracleClient 配置 Fluent NHibernate

c# - 正则表达式匹配(贪婪/不贪婪?)

c# - 将 View 模型创建为 DataContext 与创建为 StaticResource 的值(value)是什么

wpf - Fluent 约定会破坏延迟加载吗? (uNhAddIns)

WPF(MVVM): Closing a view from Viewmodel?

c# - 在 C# 中以通用方式从插入返回标识值