我将IList<T>绑定到列表框,并期望它只加载所需的数据(可见)
<Window.Resources>
<Style x:Key="lStyle" TargetType="{x:Type ListBox}">
<Setter Property="VirtualizingStackPanel.IsVirtualizing" Value="True"/>
<Setter Property="VirtualizingStackPanel.VirtualizationMode" Value="Recycling"/>
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Visible"/>
</Style>
</Window.Resources>
<Grid Height="Auto" Width="Auto">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<ListBox Name="listbox1" ItemsSource="{Binding}" Grid.Column="0" Grid.Row="0"
Style="{DynamicResource lStyle}" Height="165" Margin="0,0,0,98" Width="296">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" >
<Label Width="100" Content="{Binding Path=Name}"></Label>
<Label Width="100" Content="{Binding Path=Age}"></Label>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
class MyCollection<T> : IList<T> where T : class //Just the relevant part
{
private List<T> _list = new List<T>();
public List<T> List
{
get { return _list; }
set { _list = value; }
}
public T this[int index]
{
get
{
Trace.WriteLine("Index: " + index);
return _list[index];
}
set
{
throw new NotImplementedException();
}
}
MyCollection<Person> mycollection1;
public Window1()
{
InitializeComponent();
mycollection1 = new MyCollection<Person>();
for (int i = 0; i < 100; i++)
{
mycollection1.Add(new Person { Name = "Tom", Age = 33 } );
}
this.DataContext = mycollection1;
}当我运行应用程序时,indexer被调用100次(列表中的每一项),但它应该只为列表中的项调用。
发布于 2011-05-06 02:01:06
您也可以实现数据虚拟化,只需使用ListCollectionView:
public class MyCollection<T> : ListCollectionView
{
public MyCollection(List<T> list)
: base(list)
{
}
public override object GetItemAt(int index)
{
Debug.WriteLine(index);
return base.GetItemAt(index);
}
}那么将只查询可见的项。(你也可以实现一个自定义的CollectionView,那里有很多东西是可重写的)
编辑:你也可以实现IList,WPF似乎会检查IList,而IList不是IList。
发布于 2011-05-06 01:41:41
WPF中的virtualization support仅用于UI。这意味着它仍然会遍历所有数据项,但只会在需要时创建UIElements来显示这些项。
通常,当启用虚拟化时,滚动实际上是逐项完成的,而不是逐个像素的。为了让它在逐个项目滚动时知道滚动限制,它必须知道项目的总数。
https://stackoverflow.com/questions/5901086
复制相似问题