實(shí)時源
RealTimeSource組件旨在顯示少量快速變化的數(shù)據(jù),同時保持用戶界面的響應(yīng)性。
提示:RealTimeSource可以有效地處理不超過幾百條數(shù)據(jù)記錄的數(shù)據(jù)源。
下面的動畫演示了使用RealTimeSource綁定到動態(tài)數(shù)據(jù)的GridControl。
如果數(shù)據(jù)源中的記錄經(jīng)常更新(例如,每秒更新20,000次),您應(yīng)該考慮使用RealTimeSource組件。
使用帶有靜態(tài)數(shù)據(jù)的RealTimeSource不會帶來任何性能改進(jìn)。
提示:RealTimeSource是數(shù)據(jù)感知控件和實(shí)際數(shù)據(jù)之間的一層。
在決定在應(yīng)用程序中使用RealTimeSource組件之前,請考慮以下限制。
- RealTimeSource可以有效地處理不超過幾百條數(shù)據(jù)記錄的數(shù)據(jù)源。
- TreeListView不支持RealTimeSource。
- 當(dāng)GridControl使用RealTimeSource綁定到數(shù)據(jù)時,不支持就地編輯(以及通過內(nèi)置編輯表單進(jìn)行編輯)。
- RealTimeSource不跟蹤數(shù)據(jù)更改,要顯示數(shù)據(jù)更新,請確保數(shù)據(jù)源提供更改通知。
支持以下通知類型:
- IBindingList. ListChanged
- INotifyCollectionChanged. CollectionChanged
- INotifyPropertyChanged. PropertyChanged
初始化RealTimeSource
您可以將任何數(shù)據(jù)感知控件綁定到RealTimeSource,以GridControl為例進(jìn)行說明。
要在GridControl中顯示實(shí)時數(shù)據(jù),請執(zhí)行以下操作:
- 在代碼中,創(chuàng)建RealTimeSource對象,使用它的RealTimeSource.DataSource屬性將一個實(shí)時源鏈接到您的數(shù)據(jù)。
- 設(shè)置LookUpEditBase.ItemsSource屬性(通過GridControl.ItemsSource)到RealTimeSource對象。
C#:
ObservableCollection<Data> Persons; //... DevExpress.Data.RealTimeSource myRealTimeSource = new DevExpress.Data.RealTimeSource(); myRealTimeSource.DataSource = Persons; myGridControl.ItemsSource = myRealTimeSource;
點(diǎn)擊復(fù)制
下表描述了其他RealTimeSource配置場景。
- 指定將哪些數(shù)據(jù)源屬性傳遞給數(shù)據(jù)感知控件。
使用RealTimeSource.DisplayableProperties屬性指定所需的數(shù)據(jù)源屬性。
C#:
//A semicolon-separated list of data source property names myRealTimeSource.DisplayableProperties = "Id;Progress";
點(diǎn)擊復(fù)制
- 忽略單個屬性值的修改。
設(shè)置RealTimeSource. IgnoreItemEvents屬性設(shè)置為true。
對數(shù)據(jù)源項(xiàng)的修改將被RealTimeSource忽略。
只有對數(shù)據(jù)源列表所做的修改才會傳遞給數(shù)據(jù)感知控件。
示例
這個例子演示了如何使用RealTimeSource組件在GridControl中顯示快速變化的數(shù)據(jù)。
提示:本例中的數(shù)據(jù)是為了演示而隨機(jī)生成的。
MainWindows.xaml.cs:
using System; using System.Collections.Generic; using System.Linq; using System.Windows; using System.Collections.ObjectModel; using System.Globalization; using System.Windows.Data; using System.Windows.Markup; using DevExpress.Data; using System.Windows.Threading; using System.ComponentModel; namespace RealTimeSourceExample { public partial class MainWindow: Window { ObservableCollection<Data> Persons; int Count = 50; Random Random = new Random(); public MainWindow() { InitializeComponent(); Persons = new ObservableCollection<Data>(); for (int i = 0; i < Count; i++) Persons.Add(new Data { Id = i, Text = "Text" + i, Progress = GetNumber() }); grid.ItemsSource = new RealTimeSource() { DataSource = Persons }; DispatcherTimer timer = new DispatcherTimer(); timer.Interval = TimeSpan.FromMilliseconds(1); timer.Tick += Tick; timer.Start(); } private void Tick(object sender, EventArgs e) { int index = Random.Next(0, Count); Persons[index].Id = GetNumber(); Persons[index].Text = "Text" + GetNumber(); Persons[index].Progress = GetNumber(); } int GetNumber() { return Random.Next(0, Count); } } public class Data: INotifyPropertyChanged { private int _Id; public string _Text; public double _Progress; public int Id { get { return _Id; } set { _Id = value; NotifyPropertyChanged("Id"); } } public string Text { get { return _Text; } set { _Text = value; NotifyPropertyChanged("Text"); } } public double Progress { get { return _Progress; } set { _Progress = value; NotifyPropertyChanged("Progress"); } } public event PropertyChangedEventHandler PropertyChanged; void NotifyPropertyChanged(string name) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(name)); } } }
點(diǎn)擊復(fù)制
MainWindows.xaml.vb:
Imports Microsoft.VisualBasic Imports System Imports System.Collections.Generic Imports System.Linq Imports System.Windows Imports System.Collections.ObjectModel Imports System.Globalization Imports System.Windows.Data Imports System.Windows.Markup Imports DevExpress.Data Imports System.Windows.Threading Imports System.ComponentModel Namespace RealTimeSourceExample Partial Public Class MainWindow Inherits Window Private Persons As ObservableCollection(Of Data) Private Count As Integer = 50 Private Random As New Random() Public Sub New() InitializeComponent() Persons = New ObservableCollection(Of Data)() For i As Integer = 0 To Count - 1 Persons.Add(New Data With {.Id = i, .Text = "Text" & i, .Progress = GetNumber()}) Next i grid.ItemsSource = New RealTimeSource() With {.DataSource = Persons} Dim timer As New DispatcherTimer() timer.Interval = TimeSpan.FromMilliseconds(1) AddHandler timer.Tick, AddressOf Tick timer.Start() End Sub Private Sub Tick(ByVal sender As Object, ByVal e As EventArgs) Dim index As Integer = Random.Next(0, Count) Persons(index).Id = GetNumber() Persons(index).Text = "Text" & GetNumber() Persons(index).Progress = GetNumber() End Sub Private Function GetNumber() As Integer Return Random.Next(0, Count) End Function End Class Public Class Data Implements INotifyPropertyChanged Private _Id As Integer Public _Text As String Public _Progress As Double Public Property Id() As Integer Get Return _Id End Get Set(ByVal value As Integer) _Id = value NotifyPropertyChanged("Id") End Set End Property Public Property Text() As String Get Return _Text End Get Set(ByVal value As String) _Text = value NotifyPropertyChanged("Text") End Set End Property Public Property Progress() As Double Get Return _Progress End Get Set(ByVal value As Double) _Progress = value NotifyPropertyChanged("Progress") End Set End Property Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged Private Sub NotifyPropertyChanged(ByVal name As String) RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(name)) End Sub End Class End Namespace
點(diǎn)擊復(fù)制
MainWindows.xaml:
<Window x:Class="RealTimeSourceExample.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid" xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors" xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core" xmlns:local="clr-namespace:RealTimeSourceExample" Name="win" Title="MainWindow" Height="350" Width="525"> <Grid> <dxg:GridControl x:Name="grid"> <dxg:GridControl.Columns> <dxg:GridColumn FieldName="Id"/> <dxg:GridColumn FieldName="Text"/> <dxg:GridColumn FieldName="Progress"> <dxg:GridColumn.EditSettings> <dxe:ProgressBarEditSettings/> </dxg:GridColumn.EditSettings> </dxg:GridColumn> </dxg:GridControl.Columns> <dxg:GridControl.View> <dxg:TableView Name="view" AutoWidth="True"/> </dxg:GridControl.View> </dxg:GridControl> </Grid> </Window>
點(diǎn)擊復(fù)制