We use cookies to give you the best experience on our website. If you continue to browse, then you agree to our privacy policy and cookie policy. (Last updated on: June 24, 2019).
Unfortunately, activation email could not send to your email. Please try again.
Syncfusion Feedback

Loose selection after ItemsSource update.

Thread ID:

Created:

Updated:

Platform:

Replies:

147247 Sep 4,2019 12:07 PM UTC Sep 9,2019 01:18 PM UTC WPF 6
loading
Tags: SfDataGrid
Kasper Mathiesen
Asked On September 4, 2019 12:07 PM UTC

Hello

 

I have a program where I use MVVM pattern where a list of orders is displayed in a SfDataGrid. This data comes from a web server and the data is pulled on a timer and on change the ItemsSource of the SfDataGrid is updated to the new.

 

My problem is that every time this is done all selection is reset and the DataGrid scrolls to the top.

 

The scrolling was easily fixed by setting

 

CanMaintainScrollPosition="True"  

 

And the item I can also find again by binding SelectedItem the

 

SelectedItem="{Binding SelectedOrder, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

 

And then after and update I will find that same item again.

 

However the problem is that when I reset the SelectedOrder to the, old SelectedOrder before the pull, the selected cell end up in the first column.

 

 I have tried binding

 

CurrentColumn="{Binding SelectedColumn, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

 

And that way I can get the selected column but when I the reset SelectedColumn to the one it was in before the pull in the VeiwModel it is not updated.

 

I also tried to bind to CurrentCellInfo but cannot get this to work at all.  

 

Version. 17.2.0.34


Gowtham Gopalsamy [Syncfusion]
Replied On September 5, 2019 12:28 PM UTC

Hi Kasper,   
   
Thanks for using Syncfusion controls.   
   
Your requirement can be achieved in two ways by maintaining the selection after reset the ItemSource by using SelectedItem and SelectedIndex.   
   
If you are maintaining the selection after reset with same ItemSource by using SelectedItem.   
   
Please refer the below code snippet.  
   
var selectedItems = this.dataGrid.SelectedItem;   
this.dataGrid.ItemsSource = viewModel.Orders;   
this.dataGrid.SelectedItem = selectedItems;   
  
If you are maintaining the selection after reset with different ItemSource  by using SelectedIndex.   
   
Please refer the below code snippet.  
   
var selectedIndex = this.dataGrid.SelectedIndex;   
this.dataGrid.ItemsSource = viewModelCollection.Orders;   
this.dataGrid.SelectedIndex = selectedIndex;   
    
Please refer the below sample.  
   
   
Please let us know, if you require further assistance on this.   
   
Regards,   
Gowtham   


Kasper Mathiesen
Replied On September 5, 2019 12:36 PM UTC

Hello Gowtham   

Thank you, i already have this working by doing something similar.
var tempselected = SelectedOrder;

Then i set new itemsource

SelectedOrder = items.Where(x => x.OrderNr == tempselected.OrderNr).FirstOrDefault();

However them problem is still that the black box that represents the active cell moves to the first column after i do this.(meaning that the row is selected not the actual cell i was in before)

Kasper Mathiesen
Replied On September 6, 2019 12:09 PM UTC

So it turns out it is not selection that is my the problem but the CurrentCell.

I can bind the selected item and column and then reset it using .MoveCurrentCell after an itemsource update.

However i do not really like this approach, and i would like it do be more loose coupled with binding. 

But no matter what I try the CurrentCellInfo always returns null.

Susmitha Sundar [Syncfusion]
Replied On September 6, 2019 01:09 PM UTC

Hi Kasper, 
 
Thank you for your update. 
 
Your requirement of ”Current cell was moved after the ItemsSource collection changed” can be achieved by maintaining the CurrentCell row-column index before the ItemsSouce changing and then move the current cell to that index. Please refer the below code snippet, 
C#: 
var selectedItems = this.dataGrid.SelectedItem; 
            var currentCell = this.dataGrid.SelectionController.CurrentCellManager.CurrentRowColumnIndex; 
            this.dataGrid.ItemsSource = viewModelCollection.Orders; 
            this.dataGrid.SelectedItem = selectedItems; 
            this.dataGrid.MoveCurrentCell(currentCell); 
 
 
 
 
Please contact us for further assistance. 
 
Regards, 
 
Susmitha S

Kasper Mathiesen
Replied On September 7, 2019 06:41 AM UTC

Thank you Susmitha 

That works, only my problem with it is that it is not MVVM. In that in this case i will have the ViewModel call a method on a control in the View.

But will try and build around it. 

Susmitha Sundar [Syncfusion]
Replied On September 9, 2019 01:18 PM UTC

Hi Kasper,

In our last update, We did not use ViewModel. Before resetting the ItemsSource, get the current cell value and then call the MoveToCell() method for maintaining the current cell value. We just use the DataGrid ItemsSource collection.

Can you please explain, what is the exact issue you are facing from our suggestion and provide code snippet or issue reproducing video about this?

It will be helpful for us to investigate further.

Regards,
Susmitha S

CONFIRMATION

This post will be permanently deleted. Are you sure you want to continue?

Sorry, An error occured while processing your request. Please try again later.

Please sign in to access our forum

This page will automatically be redirected to the sign-in page in 10 seconds.

Warning Icon You are using an outdated version of Internet Explorer that may not display all features of this and other websites. Upgrade to Internet Explorer 8 or newer for a better experience.Close Icon

Live Chat Icon For mobile
Live Chat Icon