ListView 虚模式和绑定数组数据

1:WPF里面 默认是采用了虚模式的,一般情况下,不使用虚模式占的物理内存比使用虚模式多一倍,但是在界面上进行拖动的时候,流畅一些,

使用虚模式将会使用虚拟内存,占用内存较少,但是问题在有时候动态刷新数据的时候,是会卡界面的。

View Code
VirtualizingStackPanel.IsVirtualizing="True"

设置是否使用虚模式,默认是true

2:在使用listview显示大数据量是,动态添加列数据,超过200列一般会比较卡

绑定方式

申明数据集合

   List<string[]> listDataArray = new List<string[]>();

  完成初始化listDataArray

  动态添加列并绑定数据源

        for (int i = 0; i < count; i++)
            {
                GridViewColumn gridViewColumn = new GridViewColumn();
                gridViewColumn.DisplayMemberBinding = new Binding("[" + i + "]");
                myGridView.Columns.Add(gridViewColumn);
            }

数据后绑定数据源

   myListView.ItemsSource = listDataArray;

  gridViewColumn.DisplayMemberBinding = new Binding("[" + i + "]");

 

完整源码

前台

<Window x:Class="WpfApplication1.MainWindowT2"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:uc="clr-namespace:WpfApplication1"
        Title="MainWindowT2" Height="350" Width="525">
    <Window.Resources>

        <uc:IndexConverter  x:Key="indexConverter" />
            <!-- 复选框 -->
        <DataTemplate x:Key="TheCheckBox">
            <TextBlock VerticalAlignment="Center">
            <CheckBox Name="ckb_SelectAll" Click="ckb_SelectAll_Click" Margin="6 0 0 0">
                <TextBlock  Foreground="White">全选</TextBlock>
            </CheckBox>
            </TextBlock>
        </DataTemplate>


        <uc:ListViewItemStyleSelector x:Key="myStyleSelector"/>
        <Style x:Key="st" TargetType="GridViewColumnHeader">
            <Style.Setters>
                <Setter Property="Background">
                    <Setter.Value>
                        <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
                            <GradientStop Color="White" Offset="0.2"/>
                            <GradientStop Color="LightGray" Offset="0.5"/>
                            <GradientStop Color="Gray" Offset="1"/>
                        </LinearGradientBrush> 
                    </Setter.Value> 
                </Setter> 
            </Style.Setters> 
        </Style>
    </Window.Resources>
    <Grid>

        <ListView Name="myListView"    ItemContainerStyleSelector="{DynamicResource myStyleSelector}"  VirtualizingStackPanel.VirtualizationMode="Recycling" ScrollViewer.VerticalScrollBarVisibility="Visible"  >
            <ListView.View>
                <GridView x:Name="myGridView" ColumnHeaderContainerStyle="{StaticResource st}"  >
                    <!--<GridViewColumn Header="序号"  DisplayMemberBinding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}} , Converter={StaticResource indexConverter}}" />-->
                </GridView>
            </ListView.View>
        </ListView>
        <Button Height="30" Name="Btnleft"  Visibility="Hidden"  Width="100" HorizontalAlignment="Left" VerticalAlignment="Bottom" Margin="0,0,0,50" Background="Transparent" Content="Left" Click="Button_Click" />
        <Button Height="30"  Name="BtnRight" Visibility="Hidden" Width="100" HorizontalAlignment="Right" VerticalAlignment="Bottom"  Margin="0,0,0,50" Background="Transparent" Content="Right" Click="Button_Click_1" />
    </Grid>
</Window>

 后台

View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication1
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindowT2 : Window
    {
        public MainWindowT2()
        {
            InitializeComponent();


           string[]  header = new string[2050];
            for (int j = 0; j < 2050; j++)
            {
                header[j] = j + "name";
            }

            initDatas(header);//初始化列数
            
            ShowListView();
        }


        private void AddCheckBox()
        {
            GridViewColumn gvc = new GridViewColumn();
            CheckBox cb = new CheckBox();

            cb.Checked += new RoutedEventHandler(cb_Checked);
         
            cb.Content = new TextBlock().Text = "全选";
            gvc.Header = cb;
            gvc.Width = 100;
            gvc.CellTemplate = (DataTemplate)Resources["TheCheckBox"];
            myGridView.Columns.Add(gvc);
        }

        void cb_Checked(object sender, RoutedEventArgs e)
        {
            //throw new NotImplementedException();
        }
      
        int CountClos = 100;


        List<List<string>> listDataArray = new List<List<string>>();
  
        private void ShowListView()
        {

              List<string> header;


            

              for (int i = 0; i < 10000; i++)
              {
                  header = new List<string>();
                  for (int j = 0; j < 2050; j++)
                  {
                      header.Add(j + "name");
                  }
                  listDataArray.Add(header); 
              }
              myListView.ItemsSource = listDataArray;
    
        }

        void myListView_MouseWheel(object sender, MouseWheelEventArgs e)
        {
            Console.WriteLine("dddd");
        }

        void btn_Click(object sender, RoutedEventArgs e)
        {
            //VirtualizingStackPanel.IsVirtualizing="False"
            string txt = string.Empty;
           
            Clipboard.SetText(txt);
            MessageBox.Show(txt);
        }



        private void myListView_ScrollChanged(object sender, ScrollChangedEventArgs e)
        {


        }

        private void ckb_SelectAll_Click(object sender, RoutedEventArgs e)
        {

        }

        int length = 0;//总共长度
        public void initDatas(object[] cols)
        {
            length = cols.Length;
            index = 0;
            if (cols.Length > CountClos)
            {
                BtnRight.Visibility = Visibility.Visible;
            }
            int count = cols.Count() > CountClos ? CountClos : cols.Count();
            for (int i = 0; i < count; i++)
            {
                GridViewColumn gridViewColumn = new GridViewColumn();
                gridViewColumn.DisplayMemberBinding = new Binding("[" + i + "]");
                myGridView.Columns.Add(gridViewColumn);
            }
        }

        int index = 0;//0页

        /// <summary>
        /// Left
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button_Click(object sender, RoutedEventArgs e)
        {

            if (index != 0)
            {
                index--;//左移一页
               for (int i = 0; i < myGridView.Columns.Count; i++)
                {
                    myGridView.Columns[i].DisplayMemberBinding = new Binding("[" + (index * CountClos + i) + "]");
                }

               if (index == 0)
               {
                   Btnleft.Visibility = Visibility.Hidden;
               }
               BtnRight.Visibility = Visibility.Visible;
            }
        }
        /// <summary>
        /// right
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            int totle = length / CountClos;
            if (length % CountClos != 0)
            {
                totle++;
            }
            
            if (index < totle)
            {
                index++;//右移一页
                for (int i = 0; i < myGridView.Columns.Count; i++)
                {
                    myGridView.Columns[i].DisplayMemberBinding = new Binding("[" + (index * CountClos + i) + "]");
                }
            }
            if (index+1 == totle)
            {
                BtnRight.Visibility = Visibility.Hidden;
            }
            Btnleft.Visibility = Visibility.Visible;
        }


    }
}

 

间隔行变色

View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Controls;
using System.Windows;
using System.Windows.Media;
using System.Windows.Data;

namespace WpfApplication1
{
    public class ListViewItemStyleSelector : StyleSelector
    {
        public override Style SelectStyle(object item, DependencyObject container)
        {
            Style st = new Style();
            st.TargetType = typeof(ListViewItem);
            Setter backGroundSetter = new Setter();
            backGroundSetter.Property = ListViewItem.BackgroundProperty;
            ListView listView =
           ItemsControl.ItemsControlFromItemContainer(container)
           as ListView;
            int index =
           listView.ItemContainerGenerator.IndexFromContainer(container);
            if (index % 2 == 0)
            {
                backGroundSetter.Value = Brushes.LightBlue;
            }
            else
            {
                backGroundSetter.Value = Brushes.Beige;
            }
            st.Setters.Add(backGroundSetter);
            return st;
        }
    }
    public class IndexConverter : IValueConverter 
    { 
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
        { 
           ListViewItem item = value as ListViewItem;
           ListView listView = ItemsControl.ItemsControlFromItemContainer(item) as ListView;
           int index = listView.ItemContainerGenerator.IndexFromContainer(item);
           return index.ToString(); 
        }
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
        {
            throw new NotImplementedException(); 
        } 
    }

}

 

 

 

 

 

posted @ 2012-11-21 21:19  风雨摇摆  阅读(479)  评论(0)    收藏  举报