Quantcast
Channel: wpftoolkit Discussions Rss Feed
Viewing all articles
Browse latest Browse all 2157

New Post: Grid Data Virtualization Collection View

$
0
0
I'm currently trying to implement a datagrid using DataGridVirtualizingCollectionView as the ItemSource. I'm able to build the grid but when I scrolled down, the event handler attached to the QueryItemCount is called again and after that the grid seems to enter in some kind of infinite loop trying to call QueryItems and QueryItemCount events again and again.

Here the XAML of MainWindow:
<Window x:Class="XceedVirtualDataGridSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:xcdg="http://schemas.xceed.com/wpf/xaml/datagrid"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        
        
           
            <xcdg:DataGridControl
                    x:Name="grid"
                    CellEditorDisplayConditions="MouseOverCell"
                    ReadOnly="True"
                    ItemScrollingBehavior="Immediate"
                    ItemsSource="{Binding DataSourceCollectionView}"
                    SelectionMode="Single"
                    SelectionUnit="Row">
                <xcdg:DataGridControl.Resources>
                    <!--When using DataVirtualization, it is highly recommended to set a specific height on the Datarows.-->
                    <Style TargetType="xcdg:DataRow">
                        <Setter Property="Height" Value="21" />
                    </Style>
                </xcdg:DataGridControl.Resources>
                <xcdg:DataGridControl.View>
                    <xcdg:TableView Theme="{DynamicResource defaultTheme}" />
                </xcdg:DataGridControl.View>
            </xcdg:DataGridControl>

        
    </Grid>
</Window>
Here the code-behind of MainWindow:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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;
using Averna.DpSystem.Analysis;
using Xceed.Wpf.DataGrid;
using XceedVirtualDataGridSample.Packet;
using XceedVirtualDataGridSample.Person;

namespace XceedVirtualDataGridSample
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {            
            DataSource = new PersonDataSource();

            this.DataContext = this;

            InitializeComponent();

            Loaded += MainWindow_Loaded;
        }

        private IDataSourceStrategy DataSource
        {
            get;
            set;
        }

        private DataGridVirtualizingCollectionView _dataSourceCollectionView;
        public DataGridVirtualizingCollectionView DataSourceCollectionView
        {
            get 
            { 
                if (_dataSourceCollectionView == null)
                {
                    CreateDataSourceCollectionView();
                }
                
                return _dataSourceCollectionView; 
            }
        }

        void _dataSource_QueryItems(object sender, QueryItemsEventArgs e)
        {
            var asyncQueryInfo = e.AsyncQueryInfo;
            var startIndex = asyncQueryInfo.StartIndex;
            var requestedItemCount = asyncQueryInfo.RequestedItemCount;
            var objects = new List<object>(requestedItemCount);

            if (requestedItemCount == 0)
            {
                return;
            }

            for (var i = startIndex; i < requestedItemCount; i++)
            {
                objects.Add(DataSource.GetItem(i));
            }

            asyncQueryInfo.EndQuery(objects.ToArray());
        }

        void _dataSource_QueryItemCount(object sender, QueryItemCountEventArgs e)
        {
            e.Count = DataSource.Count;
        }

        void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            AddColumns();

            DataSource.Init();
        }

        private void CreateDataSourceCollectionView()
        {
            _dataSourceCollectionView = new DataGridVirtualizingCollectionView(typeof(Nullable), autoCreateItemProperties: false, pageSize: 200, maxRealizedItemCount: 1000);
            _dataSourceCollectionView.QueryItemCount += _dataSource_QueryItemCount;
            _dataSourceCollectionView.QueryItems += _dataSource_QueryItems;
        }

        private void AddColumns()
        {
            foreach (var column in DataSource.GetColumns())
            {
                grid.Columns.Add(column);
            }     
        }
    }
}
Am I doing something wrong? I based my code from the Xceed DataVirtualization C# sample.

I've put my sample here (XccedVirtualDataGridSamples.zip)

Thanks for the help!

Viewing all articles
Browse latest Browse all 2157

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>