软件应用程序中datagrid的一个常见场景是显示datagrid内部值的实时更新。例如,用于查看股票价格的网格可能会在交易时间内显示频繁的更新。或者,用于编辑客户数据的网格可能会在运行时使用其他用户导致的数据库更改进行更新。
由于显示实时更新是datagrid的一项不可或缺的功能,因此Infragistics Xamarin网格将立即响应引发INotifyCollectionChanged.CollectionChanged事件或INotifyPropertyChanged.PropertyChanged事件的所有数据更新。
示例在这个博客演示了在一个简单的方式。每33毫秒调用一次 “Tick” 方法,将numeric属性更新为随机选择的1000数据项的随机值。正如预期的那样,一旦在代码中更改值,网格就会更新数字单元格。
private void Tick ()
{
const int toChange = 1000; // 要更改的数据项
HashSet toChangeIndexes = new HashSet();
bool stillAnimating = _data.Any((item) => item.YearToDateSalesHeat > 0 ); // 如果任何项目是 “热” 的,那么我们仍然会动画它们的背景颜色。如果 (!
stillAnimating) // 不更新任何东西,如果动画正在进行
{
_lastDataUpdate = DateTime.Now;
for (var i = 0; i < toChange;i )
{
int index = _rand.Next(_data.Count -1 );
while (toChangeIndexes.Contains(index))
{
index = _rand.Next(_data.Count -1 );
}
toChangeIndexes.Add(index);
}
}
为 (var i = 0; i < _data.Count; i )
{
var item = _data[i];
if (toChangeIndexes.Contains(i)) // 如果此项已标记为更改... ,则
{
item.YearToDateSales = _rand.Next( 4 ); // 将其YearToDateSales更改为随机数。
项.YearToDateSalesHeat = 1;// 将其YearToDateSalesHeat设置为1以指示值刚刚更改。
}
else // 如果项目未标记为更改... {
if (item
。YearToDateSalesHeat > 0) // 如果最近更改了...
{
,// 减少其YearToDateSalesHeat直到达到零。
item.YearToDateSalesHeat -= .03;
if (item.YearToDateSalesHeat < 0)
{
item.YearToDateSalesHeat = 0;
}
}
}
}
// 我们已经更新了YearToDateSales值的许多数据点。 // 如果网格当前排序此列,请调用QueueAutoRefresh按钮重新排序网格。
bool sortedBySales = grid.SortDescriptions.Any((sortDescription) => sortDescription.PropertyName = = "YearToDateSales" );
if (sortedBySales & toChangeIndexes.Count > 0)
{
grid.ActualDataSource.Queautorefresh ();
}
// 重新调用此方法进行另一次更新。
Task.Delay( 33 ).ContinueWith((t) =>
{
Device.BeginInvokeOnMainThread(() =>
{
Tick();
});
});
}
进一步探索,此示例还演示了一种用于数字单元格的上下文着色的良好技术。在代码中处理数字列的数据绑定事件时,将根据每个数据项的属性选择一种从白色到红色的颜色,该属性表示该项目的更新时间。
私人 无效 yearToDateSalesColumn_DataBound(对象sender, Infragistics.XamarinForms.Controls.Grids.DataBindingEventArgs args)
{
// 使用DataBound事件根据YearToDateSalesHeat值对YearToDateSales单元格执行上下文着色。
var项目 = args.CellInfo.RowItem作为IGSalesmanItem;
如果(项目!=null)
{
如果(item.YearToDateSalesHeat>0)
{
varp = item.YearToDateSalesHeat;
vartoA =1.0;
varfromA =1.0;
vartoR =1.0;
varfromR =1.0;
vartoG =0.0;
varfromG =1.0;
vartoB =0.0;
varfromB =1.0;
vara = fromA (toA - fromA) * p;
varr = fromR (toR - fromR) * p;
varg = fromG (toG - fromG) * p;
varb = fromB (toB - fromB) * p;
var画笔 =新建SolidColorBrush(Color.FromRgba(r, g, b, a));
args.CellInfo.Background = 画笔;
}
其他
{
args.CellInfo.Background =新建SolidColorBrush(Color.White);
}
}
}
最终结果是一个美丽的,响应迅速的网格,具有实时更新和单元格的上下文着色,在短时间内用少量代码生成。下面是示例应用程序的链接。
,请务必访问我们的Infragistics Ultimate UI for Xamarin网站,在这里您可以快速了解如何使用我们令人难以置信的Xamarin生产力包加快速度,并下载该产品的免费试用版。</p