Dear Telerik,
I encountered pretty weird behavior while using VirtualQueryableCollectionView+grid.
I have a grid and a simple combobox for filtering. When I select a value in the combobox everything works as expected:
-- selected combobox value changed
-- handle property change event in the model
-- set collection total and reload required page
However if i click any cell I can see that virtual collection reloads ALL the pages. I attached a small repro u can play with.
Scenario 1: start the app - select a unit from the combobox - click any cell (e.g. top left cell) - check the output
Scenario 2: start the app - click the button - click any cell (e.g. top left cell) - check the output
--
Here is the xaml
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
Title="MainWindow" Height="350" Width="525" WindowStartupLocation="CenterScreen">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<telerik:RadButton Content="reload" HorizontalAlignment="Left" Margin="2" Command="{Binding ReloadCommand}" />
<telerik:RadComboBox ItemsSource="{Binding Units}" HorizontalAlignment="Right" Margin="2"
EmptyText="select unit" SelectedItem="{Binding Unit, Mode=TwoWay}"/>
<telerik:RadGridView AutoGenerateColumns="False" ShowGroupPanel="False"
ItemsSource="{Binding Data}" Grid.Row="1" IsReadOnly="True" >
<telerik:RadGridView.Columns>
<telerik:GridViewDataColumn DataMemberBinding="{Binding RowNo}" Header="row no" />
</telerik:RadGridView.Columns>
</telerik:RadGridView>
</Grid>
</Window>
Here is the model
#region Usings
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Windows.Input;
using Telerik.Windows.Data;
#endregion
namespace WpfApplication1
{
public class Model
{
#region Class constants
private const int PAGE_SIZE = 100;
#endregion
#region Class members
private UnitType _unit;
protected VirtualQueryableCollectionView _data;
#endregion
#region Class properties
public IEnumerable<UnitType> Units
{
get
{
return Enum
.GetValues( typeof( UnitType ) )
.Cast<UnitType>()
.ToList();
}
}
public UnitType Unit
{
get
{
return _unit;
}
set
{
_unit = value;
LoadHistory();
}
}
public VirtualQueryableCollectionView Data
{
get
{
return _data;
}
}
public CommandHandler ReloadCommand { get; set; }
#endregion
#region Class initialization
public Model()
{
_data = new VirtualQueryableCollectionView()
{
LoadSize = 100
};
_data.ItemsLoading += ( o, ea ) => OnNeedDataPage( ea.StartIndex / _data.LoadSize );
ReloadCommand = new CommandHandler( x => LoadHistory(), true );
}
#endregion
#region Class event handlers
private void LoadHistory()
{
_data.ResetItems();
LoadHistory( 0 );
}
protected void OnNeedDataPage( int iPageIndex )
{
LoadHistory( iPageIndex );
}
private void LoadHistory( int iPageIndex )
{
var iTotalCount = 1000;
Debug.WriteLine( "load glass history page: " + iPageIndex );
if( iTotalCount != _data.VirtualItemCount )
{
_data.VirtualItemCount = iTotalCount;
}
int iStartIndex = iPageIndex * PAGE_SIZE;
var list = new List<TestData>();
for( int i = iPageIndex * PAGE_SIZE; i < iPageIndex * PAGE_SIZE + PAGE_SIZE; ++i )
{
list.Add( new TestData() { RowNo = i } );
}
_data.Load( iStartIndex, list );
}
#endregion
#region Class internal structs
public enum UnitType
{
none,
a,
b
}
public class TestData
{
public int RowNo { get; set; }
}
#endregion
}
public class CommandHandler:ICommand
{
#region Class members
protected Action<object> _action;
protected bool _canExecute;
#endregion
#region Class events
public event EventHandler CanExecuteChanged;
public void FireCanExecuteChanged( bool b )
{
_canExecute = b;
if( null != CanExecuteChanged )
{
CanExecuteChanged( this, EventArgs.Empty );
}
}
#endregion
#region Class initialization
public CommandHandler( Action<object> action, bool canExecute )
{
_action = action;
_canExecute = canExecute;
}
#endregion
#region Class public methods
public bool CanExecute( object parameter )
{
return _canExecute;
}
public void Execute( object parameter )
{
_action( parameter );
}
#endregion
}
}