首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设置列表框数据( VirtualizationMode )

设置列表框数据( VirtualizationMode )
EN

Stack Overflow用户
提问于 2011-05-06 00:26:50
回答 2查看 542关注 0票数 2

我将IList<T>绑定到列表框,并期望它只加载所需的数据(可见)

代码语言:javascript
复制
 <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次(列表中的每一项),但它应该只为列表中的项调用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-06 02:01:06

您也可以实现数据虚拟化,只需使用ListCollectionView:

代码语言:javascript
复制
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。

票数 0
EN

Stack Overflow用户

发布于 2011-05-06 01:41:41

WPF中的virtualization support仅用于UI。这意味着它仍然会遍历所有数据项,但只会在需要时创建UIElements来显示这些项。

通常,当启用虚拟化时,滚动实际上是逐项完成的,而不是逐个像素的。为了让它在逐个项目滚动时知道滚动限制,它必须知道项目的总数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5901086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档