2016-06-28 66 views
1

我有DataGrid裏面有列。刷新Silverlight中的DataGrid

我希望DataGrid每3秒刷新一次,其中包含來自服務的數據。

我需要的是Scroll不會跳轉到DataGrid的頂部,每次刷新的時間,留在同一個地方Scroll的。可能嗎?

這裏是我的代碼:

<sdk:DataGrid Grid.Row="1" FlowDirection="RightToLeft" ColumnHeaderHeight="32" 
     AutoGenerateColumns="False" Name="RealTimeReportDataGrid" 
     RowEditEnded="LinesDataGrid_RowEditEnded" RowHeight="40"> 
     <sdk:DataGrid.Columns>...</sdk:DataGrid.Columns> 
</sdk:DataGrid> 

這是後面的代碼:提前

 public RealTimeReport() 
    { 
     InitializeComponent(); 
     Loaded += OnViewLoaded; 
     RealTimeReportService.RealTimeReportServiceClient RTws = new RealTimeReportService.RealTimeReportServiceClient(); 
     RTws.GetRealTimeReportAsync(); 
     RTws.GetRealTimeReportCompleted += new EventHandler<RealTimeReportService.GetRealTimeReportCompletedEventArgs>(RTws_GetRealTimeReportCompleted); 

    } 

    void RTws_GetRealTimeReportCompleted(object sender, RealTimeReportService.GetRealTimeReportCompletedEventArgs e) 
    { 
     var t = e.Result.ToList(); 
     RealTimeReportDataGrid.ItemsSource = new System.Collections.ObjectModel.ObservableCollection<ShahalDialerRT.RealTimeReportService.RealTimeReport>(e.Result.ToList()); 
    } 


    private void OnViewLoaded(object sender, RoutedEventArgs e) 
    { 
     Start(); 
    } 

    private void OnUpdaterTimerTick(object sender, EventArgs e) 
    { 
     RealTimeReportService.RealTimeReportServiceClient RTws = new RealTimeReportService.RealTimeReportServiceClient(); 
     RTws.GetRealTimeReportAsync(); 
     RTws.GetRealTimeReportCompleted += new EventHandler<RealTimeReportService.GetRealTimeReportCompletedEventArgs>(RTws_GetRealTimeReportCompleted); 
    } 


    public void Start() 
    { 
     InitializeRefreshDataTimer(); 
    } 


    public void InitializeRefreshDataTimer() 
    { 
     _updaterTimer.Interval = new TimeSpan(0, 0, 0, 0, 3000); 
     _updaterTimer.Tick += OnUpdaterTimerTick; 
     _updaterTimer.Start(); 
    } 

感謝。

更新: @StepUp,這是我做出的唯一改變,根據你所說的話,但仍然沒有改變:(

void RTws_GetRealTimeReportCompleted(object sender, RealTimeReportService.GetRealTimeReportCompletedEventArgs e) 
{ 
    var t = e.Result.ToList(); 

    RealTimeReportDataGrid.ItemsSource = new System.Collections.ObjectModel.ObservableCollection<ShahalDialerRT.RealTimeReportService.RealTimeReport>(e.Result.ToList()); 

    this.RealTimeReportDataGrid.Dispatcher.BeginInvoke(() => 
    { 
     RealTimeReportDataGrid.ScrollIntoView(
     RealTimeReportDataGrid.SelectedItem, 
     RealTimeReportDataGrid.CurrentColumn); 
    }); 
    //RealTimeReportDataGrid.ItemsSource = new System.Collections.ObjectModel.ObservableCollection<ShahalDialerRT.RealTimeReportService.RealTimeReport>(e.Result.ToList()); 
    //RealTimeReportDataGrid.UpdateLayout(); 
    //RealTimeReportDataGrid.ScrollIntoView(RealTimeReportDataGrid.SelectedItem, RealTimeReportDataGrid.Columns[0]); 
} 

回答

2

要刷新每3秒只是use Timer class

System.Timers.Timer aTimer = new System.Timers.Timer(); 
aTimer.Elapsed+=new ElapsedEventHandler(OnTimedEvent); 
aTimer.Interval=3000; 
aTimer.Enabled=true; 


// Specify what you want to happen when the Elapsed event is raised. 
private static void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    //add new data 
} 

Elapsed事件將在X秒數內上升,以毫秒爲單位,以Timer對象上的Interval屬性指定,它將調用Event Handler您指定的方法,在上面的示例中是OnTimedEvent

爲了保持Scroll在同一位置DataGrid

yourDataGrid.ItemsSource = data; 
yourDataGrid.UpdateLayout(); 
yourDataGrid.ScrollIntoView(theDataGrid.SelectedItem, theDataGrid.Columns[0]); 

更新:

yourDataGrid.Dispatcher.BeginInvoke(() => 
{ 
    yourDataGrid.Focus();  
    yourDataGrid.SelectedItem=whateverYouWant; 
    yourDataGrid.CurrentColumn=yourDataGrid.Columns[0]; 
    yourDataGrid.ScrollIntoView(yourDataGrid.SelectedItem, yourDataGrid.CurrentColumn); 
}); 

OR:

yourDataGrid.SelectedIndex = 5; // the index you want to select 
yourDataGrid.UpdateLayout(); 
yourDataGrid.ScrollIntoView(Grid.SelectedItem, 0); 
+0

我編輯我原來的職位,只是在同一時間你已經回答了。現在刷新是可以的,但滾動後滾動仍然跳到頂部。 – David

+0

@David你見過我答案的底部嗎?你有沒有嘗試過'yourDataGrid.ScrollIntoView(theDataGrid.SelectedItem,theDataGrid.Columns [0]);'? – StepUp

+0

是的,我試圖把它放在'RTws_GetRealTimeReportCompleted'的末尾。但沒有任何改變。 – David