【问题标题】:refresh datagrid items without losing selected row - XAML刷新数据网格项目而不丢失所选行 - XAML
【发布时间】:2013-03-15 14:55:57
【问题描述】:

我有两个datagrid's (Master/detailL)。我每 5 秒使用DispatcherTimer 刷新我的窗口。当我选择主网格上的任何行时,所选行上的焦点仅停留这 5 秒,之后选择焦点移动到最顶部的行。

如何在 XAML 中解决这个问题?

编辑

 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">

【问题讨论】:

  • 你能显示代码吗?您是否每次都在清除 ItemsSource 网格?
  • 请检查我编辑的代码。我只是每 5 秒调用一次 dispatcherTimer
  • 您是否在 View 中执行所有操作?你不使用 MVVM 吗?
  • 不,我没有使用 MVVM atm

标签: wpf xaml wpfdatagrid


【解决方案1】:

您好,您需要在调用之前保留 DataGrid 的 SelectedItem

serversViewSource.Source = serversQuery.ToList();

然后将其分配回该 DataGrid 的 SelectedItem。但是在将该对象分配回 SelectedItem 之前,您必须在 Collection 中找到与保留的 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();
    }

【讨论】:

  • 谢谢,但我不明白这一行“但是在将该对象分配回 SelectedItem 之前,您必须在 Collection 中找到与保留的 SelectedItem 具有相同值的项目。”
  • 是否可以通过 xaml 实现这一点?
  • 这意味着您的 SelectedItem 的引用应该与您收藏中的引用相同。请您显示您收藏的类型。
  • 不,我认为它在 xaml 中是不可能的。
  • 我没有任何集合,我只是从数据源中拖放数据网格并修改自动生成的代码。有没有其他方法可以使用集合(来自实体的手段)来做同样的事情。我可以试试。
猜你喜欢
  • 2012-09-30
  • 1970-01-01
  • 2014-01-06
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-22
  • 1970-01-01
相关资源
最近更新 更多