作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要在 WPF 应用程序中处理大量数据。
我已将大型集合绑定(bind)到 ListView 并且我正在使用 ItemContainerStyle
将列表项的 IsSelected 属性与我的对象的 IsSelected
绑定(bind)属性,以便当在 ListView
中选择项目时,我的对象'IsSelected
属性也将设置为 true。通过这样做,我可以轻松地仅对列表中已选择的对象执行命令。
我在 ListView 中使用 UI 虚拟化,因为否则应用程序会很缓慢。但是因为我的整个集合中只有一个子集在列表中可见,所以当我使用 CTRL+A 选择列表中的所有项目时,只有加载的项目有它们的 IsSelected
属性设置为真。不可见的项目(被虚拟化的项目)有它们的 IsSelected
属性设置为假。这是一个问题,因为当我选择列表中的所有项目时,我希望 IsSelected
集合中所有项目的属性设置为 true。
我创建了一些示例代码来说明问题:
主窗口.xaml
<Window x:Class="VirtualizationHelp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" x:Name="wnd">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Button Grid.Row="0" Content="Click me" Click="Button_Click" />
<ListView Grid.Row="1" ItemsSource="{Binding Path=Persons, ElementName=wnd}">
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}"/>
</Style>
</ListView.ItemContainerStyle>
</ListView>
</Grid>
</Window>
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
namespace VirtualizationHelp
{
public partial class MainWindow : Window
{
List<SelectablePerson> _persons = new List<SelectablePerson>(10000);
public List<SelectablePerson> Persons { get { return _persons; } }
public MainWindow()
{
for (int i = 0; i < 10000; i++)
{
SelectablePerson p = new SelectablePerson() { Name = "Person " + i, IsSelected = false };
_persons.Add(p);
}
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
int count = Persons.Where(p => p.IsSelected == true).Count();
(sender as Button).Content = count.ToString();
}
}
public class SelectablePerson
{
public string Name { get; set; }
public bool IsSelected { get; set; }
public override string ToString()
{
return Name;
}
}
}
最佳答案
我认为这是你的约束力。基本上你正在更新/绑定(bind) ListViewItem,它只会更新可见的,而不是整个列表。我会玩它,现在你可以在代码绑定(bind)中解析..
<Window x:Class="VirtualizationHelp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" x:Name="wnd">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBlock x:Name="txtSelectedItemsCount"/>
<ListView Grid.Row="1" ItemsSource="{Binding Path=Persons, ElementName=wnd}"
SelectionChanged="ListView_SelectionChanged"/>
</Grid>
</Window>
private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var lv = (ListView) sender;
txtSelectedItemsCount.Text = lv.SelectedItems.Count.ToString();
}
关于wpf - 如何在 ListView 中为不可见(虚拟化)项目绑定(bind) IsSelected,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7372893/
我是一名优秀的程序员,十分优秀!