2

私は2つ持っていますdatagrid'(マスター/詳細)。DispatcherTimer5秒ごとに使用してウィンドウを更新します。マスターグリッドで任意の行を選択すると、選択した行のフォーカスはその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">
4

1 に答える 1

3

こんにちは、呼び出す前にDataGridのSelectedItemを保持する必要があります

serversViewSource.Source = serversQuery.ToList();

次に、それをそのDataGridのSelectedItemに割り当てます。ただし、そのオブジェクトをSelectedItemに割り当てる前に、保存されているSelectedItemと同じ値を持つアイテムをCollectionで見つける必要があります。

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();
    }
于 2013-03-15T15:22:17.103 に答える