MVVM性能:使用DataTemplate时不要处置View

时间:2015-05-04 14:50:04

标签: c# wpf mvvm

我遇到了性能问题,我需要帮助来克服它。

有一个窗口使用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}}

0 个答案:

没有答案