我已经实现类似于在所描述的一个的选择图案此篇使用视图模型来存储IsSelected值,并通过结合所述ListViewItem.IsSelected的视图模型IsSelected:
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="IsSelected" Value="{Binding Mode=TwoWay, Path=IsSelected}"/>
</Style>
</ListView.ItemContainerStyle>
Run Code Online (Sandbox Code Playgroud)
它一般工作,但我遇到了严重的问题.通过VirtualizingStackPanel在列表视图中使用a 作为面板,仅ListViewItem创建了可见的.如果我使用"Ctrl + A"选择所有项目,或者使用第一项上的"Shift + Ctrl + End"快捷键组合,则会选择所有项目,但对于不可见项目,ViewModel不会获取其IsSelected设为true.这是合乎逻辑的,因为如果ListViewItem没有创建,绑定就无法工作.
任何人都遇到了同样的问题,并找到了解决方案(除了不使用a VirtualizingStackPanel)?
我有一个Windows窗体应用程序,它有一个包含WPF UserControl的ElementHost ......在我的WPF中,我有一个非常简单的ListView:
<ListView Margin="4" ItemsSource="{Binding Notifications}">
<ListView.View>
<GridView>
<GridViewColumn Header="FirstName" DisplayMemberBinding="{Binding FirstName}" />
<GridViewColumn Header="LastName" DisplayMemberBinding="{Binding LastName}" />
<GridViewColumn Header="Address" DisplayMemberBinding="{Binding Address}" />
<GridViewColumn Header="City" DisplayMemberBinding="{Binding City}" />
<GridViewColumn Header="State" DisplayMemberBinding="{Binding State}" />
<GridViewColumn Header="Zip" DisplayMemberBinding="{Binding Zip}" />
</GridView>
</ListView.View>
</ListView>
Run Code Online (Sandbox Code Playgroud)
如果我的源有10个项目,表单加载不到一秒钟.如果我的来源有1000个项目,则需要7秒!我的计时器只考虑加载(而不是获取物品所需的时间).
所以我的问题是:
使用ElementHost是一场表演噩梦吗?
WPF DataBinding是一场性能噩梦吗?
ListView是一块废话吗?(顺便说一句,与WPFToolkit的DataGrid相同的结果)?
我在 WPF 中使用 ListView 时遇到性能非常差的情况,使用大约 30000 条记录。据我所知,虚拟化应该打开,因为这是默认设置(我什至在 XAML 中显式打开它)。
表现不佳的表现是这样的:
我希望有人能看一下 XAML 并让我有一些想法。
<ListView Name="grdComms" Grid.Row="0" Grid.Column="0" SelectedItem="{Binding SelectedHeader}"
VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling"
ScrollViewer.IsDeferredScrollingEnabled="True">
<ListView.View>
<GridView >
<GridViewColumn Header="Account Name" DisplayMemberBinding="{Binding Path=AccountName}" Width="150" />
<GridViewColumn Header="Account Number" DisplayMemberBinding="{Binding Path=AccountNumber}" Width="120" />
<GridViewColumn Header="Type" DisplayMemberBinding="{Binding Path=Type}" Width="80" />
<GridViewColumn Header="Delivery" DisplayMemberBinding="{Binding Path=Delivery}" Width="80" />
<GridViewColumn Header="Count" DisplayMemberBinding="{Binding Path=RequestCount}" Width="80" />
<GridViewColumn Width="80" Header="DeDupe">
<GridViewColumn.CellTemplate>
<DataTemplate>
<StackPanel Width="80">
<CheckBox HorizontalAlignment="Center" IsChecked="{Binding Path=SelectedForProcessing, Mode=TwoWay}"/>
</StackPanel>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
Run Code Online (Sandbox Code Playgroud)
注意:ItemsSource …
listview ×3
wpf ×3
c# ×1
datagrid ×1
elementhost ×1
mvvm ×1
performance ×1
stackpanel ×1
xaml ×1