我遇到了性能问题,我需要帮助来克服它。
有一个窗口使用UserControl
显示不同的视图(用户控件)。我有一堆ViewModel和相应的DataTemplate
通过<DataTemplate DataType="{x:Type l:ViewModelPageA}">
<l:UserControlPageA/>
</DataTemplate>
<DataTemplate DataType="{x:Type l:ViewModelPageB}">
<l:UserControlPageBk/>
</DataTemplate>
绑定:
UserControl
这会根据现在显示的ViewModel创建视图。
ListView
中的一个具有相当全面的ListViewItems
(许多绑定,触发器等)。当切换到此用户控件ViewModel时,存在显着延迟(超过一秒)。
我已经查看了虚拟,但它看起来并不像我关注的:ViewModel在交换机之间保持不变,只有100个项目,并且在呈现用户控件后没有性能问题。实际上使用 PgUp PgDown 时有一点延迟,这对我来说就像某种虚拟化(ListView
不是为不可见的项目创建的。)
问题在于初始视图加载。加载需要太多时间。并且需要更多,因为到目前为止只有50%的绑定/触发器完成。没有物品装载几乎是即时的。
在winforms中,例如没有MVVM我在内存中保留了视图(表单)并在它们之间切换。也许这就是我应该在wpf中做的事情(为了保持对这个有问题的ViewModel的看法活着)?
问题:考虑到(如果没有更好的替代方案可以提高性能),在使用MVVM和数据模板时如何重用视图?
预测评论&#34;向我们展示一些代码&#34;这里有一些东西可以让你了解<ListView x:Name="listView" ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" IsSynchronizedWithCurrentItem="True">
<ListView.Resources>
<!-- cell template, there are many of such -->
<DataTemplate x:Key="cellTemplateA">
<StackPanel>
<StackPanel Orientation="Horizontal">
<Button CommandParameter="{Binding}" Command="{Binding DataContext.CommandA, ElementName=listView}"
Visibility="{Binding IsCommandAVisible}" l:ButtonBehavior.SelectListViewItemOnFocus="True">
<Viewbox>
<Grid>
<!-- some simple vector graphic -->
<Path Width="13" Height="13" ...
Visibility="{Binding IsExpanded, Converter={l:BoolToVisibilityHiddenConverter}, ConverterParameter=CollapsedInverted}"/>
<Path Width="13" Height="13" ...
Visibility="{Binding IsExpanded, Converter={l:BoolToVisibilityHiddenConverter}, ConverterParameter=Collapsed}"/>
</Grid>
</Viewbox>
</Button>
<!-- more of such buttons -->
</StackPanel>
<!-- more of elements using visibility binding -->
</StackPanel>
</DataTemplate>
</ListView.Resources>
<ListView.View>
<GridView>
<!-- many columns using different cell templates -->
<GridViewColumn Header="Date" CellTemplate="{StaticResource cellTemplateDate}"/>
</GridView>
</ListView.View>
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="VerticalContentAlignment" Value="Top"/>
<Style.Triggers>
<!-- and a lot of triggers here -->
</Style.Triggers>
</Style>
</ListView.ItemContainerStyle>
</ListView>
并发症:
{{1}}