Indhi
Indhi

Reputation: 1694

refresh datagrid items without losing selected row - XAML

I have two datagrid's ( Master/detaiL). I refresh my window using DispatcherTimer for every 5 secs. when I select any row on my Master grid, the focus on the selected row stays only for those 5 secs, after that the selection focus moves to the top most row.

how to overcome this issue in XAML?

EDIT

 public partial class MyWindow : Window
{
    ProdEntities _prodEntities = new ProdEntities();

    public MyWindow()
    {
        InitializeComponent();
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        try
        {
            RebindData();
            SetTimer();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }

    private void SetTimer()
    {
        DispatcherTimer dispatcherTimer = new DispatcherTimer();
        dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
        dispatcherTimer.Interval = new TimeSpan(0, 0, 5);
        dispatcherTimer.Start();
    }

    protected void dispatcherTimer_Tick(object sender, EventArgs e)
    {
        RebindData();
    }

    private void RebindData()
    {
        CollectionViewSource serversViewSource = (CollectionViewSource)(FindResource("serversViewSource"));
        IQueryable<Server> serversQuery = this.GetServersQuery(_prodEntities );
        serversViewSource.Source = serversQuery.ToList();

        //serversViewSource.View.Refresh();
    }

    private IQueryable<Server> GetServersQuery(ProdEntities _prodEntities)
    {
        var serversQuery = _prodEntities.Servers.Where(c => c.Components.Any());
        return serversQuery;
    }

    private void SaveChanges_Click(object sender, RoutedEventArgs e)
    {
        _prodEntities.SaveChanges();
    }       
}

XAML

  <DataGrid AutoGenerateColumns="False" Foreground="DarkBlue"   DataContext="StaticResource serversComponentsViewSource}"
 ItemsSource="{Binding}" Name="componentsDataGrid">

Upvotes: 2

Views: 4852

Answers (1)

yo chauhan
yo chauhan

Reputation: 12295

Hi you need to preserve SelectedItem of your DataGrid before you call

serversViewSource.Source = serversQuery.ToList();

and then assign it back to SelectedItem of that DataGrid. But you will have to find the item in Collection that has same Values as that in preserved SelectedItem before you assign that object back to SelectedItem.

private void RebindData()
    {
        CollectionViewSource serversViewSource = (CollectionViewSource)(FindResource("serversViewSource"));
        var selectedItem = (Server)componentsDataGrid.SelectedItem;
        IQueryable<Server> serversQuery = this.GetServersQuery(_prodEntities);
        serversViewSource.Source = serversQuery.ToList();

        foreach (var item in (IEnumerable<Server>)serversViewSource.Source )
        {
            if (selectedItem.PropName == item.PropName)//Compare the values here
            {
                componentsDataGrid.SelectedItem = item;
                break;
            }

        }
        //serversViewSource.View.Refresh();
    }

Upvotes: 3

Related Questions