I am using WPF DataGrid which has ~50 rows. I am using MVVM pattern. User can search for some text in a row and datagrid should highlight the row (not necessarily select the row) and scroll to that row if that row is not visible on screen yet.
Trimmed XAML code:
<DataGrid ItemsSource="{Binding MyDataView,Mode=TwoWay}" Name="myDataGrid"
AutoGeneratingColumn="Generate_Column"
CurrentCell="{Binding DGCurrentCell, Mode=OneWayToSource}" SelectedItem="{Binding SelectedRow, Mode=TwoWay}"
HorizontalScrollBarVisibility="Disabled" VirtualizingPanel.ScrollUnit="Item"
VirtualizingStackPanel.VirtualizationMode="Recycling" VirtualizingStackPanel.IsVirtualizing="False"
IsSynchronizedWithCurrentItem="True">
Code Behind:
public void ScrollToItem(object gridObj, object item)
{
myDataGrid.Dispatcher.BeginInvoke((Action)(() =>
{
myDataGrid.Focus();
myDataGrid.UpdateLayout();
myDataGrid.ScrollIntoView(item);
}));
}
ViewModel:
protected override bool FindItem(string searchString)
{
bool itemFound=false;
DataRow[] rows = this.MyDataTable.Select(searchString);
if (rows.Count() > 0)
{
itemFound = true;
//Scroll to the first row which is a match
(this.View as SCDataGridView).ScrollToItem(this, rows[0]);
}
return itemFound;
}
ScrollToItem API is called if item is found, but scrollviewer never scrolls to that item. I tried various combinations for the following fields but nothing has helped me so far:
HorizontalScrollBarVisibility- Auto or Disabled
VirtualizingPanel.ScrollUnit- Pixel or Item
VirtualizingStackPanel.VirtualizationMode- Standard or Recycling
VirtualizingStackPanel.IsVirtualizing - True or False
What am I missing?
Thanks,
RDV