提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
转帖|其它|编辑:郝浩|2011-05-31 14:26:27.000|阅读 1284 次
概述:在上一篇文章中,我们实现了如何让Silverlight4中的DataPager控件实现服务器端分页而不是客户端分页,我们在服务器端的WCF Ria Service实现了一个取得总页数的函数和一个按页码取得数据的函数。今天补充一下,把上文的前台部分用MVVM的模式实现。也比较简单的。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
在上一篇文章中,我们实现了如何让Silverlight4中的DataPager控件实现服务器端分页而不是客户端分页,我们在服务器端的WCF Ria Service实现了一个取得总页数的函数和一个按页码取得数据的函数。今天补充一下,把上文的前台部分用MVVM的模式实现。也比较简单的。
先看一下Xaml代码,我们实现一个DataGrid和一个DataPager,有一个BusyIndicator,当DataGrid加载数据的时候自动显示一个进度条并灰掉后面的控件,这个是和ViewModel的IsBusy绑定的,具体实现看我的另外一篇文章。代码:
<UserControl x:Class="MySilverlightApplication"
xmlns="//schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="//schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="//schemas.microsoft.com/expression/blend/2008"
xmlns:i="//schemas.microsoft.com/expression/2010/interactivity"
xmlns:mc="//schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:Height="Auto" d:Width="Auto" xmlns:sdk=
"//schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
xmlns:toolkit=
"//schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit">
<Grid x:Name="LayoutRoot" Background="White">
<toolkit:HeaderedContentControl Name=
"headeredContentControl1" Width="Auto">
<toolkit:BusyIndicator Name="busyIndicator1" IsBusy=
"{Binding IsBusy}" DisplayAfter="0" BusyContent="Fetching data...">
<sdk:DataGrid AutoGenerateColumns="False"
GridLinesVisibility="None" Width="Auto"
HorizontalAlignment="Stretch" VerticalAlignment=
"Stretch" BorderThickness="0,0,0,0" SelectionMode="Single"
Name="dgvRecentUpdated" IsReadOnly="True">
<sdk:DataGrid.Columns>
<sdk:DataGridTextColumn Header="ProductID" Binding=
"{Binding ProductID}" Visibility="Collapsed" />
<sdk:DataGridTextColumn Header="Product Name"
Binding="{Binding Name}" Width="120" />
<sdk:DataGridTextColumn Header="Product Desc"
Binding="{Binding Desc}" Width="120"/>
</sdk:DataGrid.Columns>
</sdk:DataGrid>
</toolkit:BusyIndicator>
</toolkit:HeaderedContentControl>
<sdk:DataPager Height="25" HorizontalAlignment=
"Stretch" Name="dataPager1" Source="{Binding PagerContext}"
VerticalAlignment="Bottom" Width="Auto" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="PageIndexChanged">
<i:InvokeCommandAction Command=
"{Binding SetResultsByPagerCommand}" CommandParameter="
{Binding PageIndex, ElementName=dataPager1, Mode=OneWay}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</sdk:DataPager>
</Grid>
</UserControl>
注意DataPager的Source绑定,PageIndexChanged事件绑定到Command,绑定的事件的参数是PageIndex - 请求的页码。
先来实现PageIndexChanged事件绑定的SetResultsByPagerCommand :
//在ViewModel构造函数中
SetResultsByPagerCommand = new DelegateCommand
(SetResultsByPager, CanSetResultsByPager);
//....
private int _PageSize = 10;
public ICommand SetResultsByPagerCommand { get; set; }
public void SetResultsByPager(object param)
{
//调用WCF Ria Service得到当前页码的数据
PerformQuery<MyEntity>(
MyDomainContext.GetDataQuery("234", _PageSize,
Convert.ToInt32(param) + 1), //这个是当前的页码
GetMyDataComplete); //在这个事件中更新DataGrid模型,自动通知界面
}
private bool CanSetResultsByPager(object param)
{
return true;
}
再来实现DataPager绑定的Source - PagerContext:
private List<int> pagerItemsCount;
private PagedCollectionView _PagerContext;
public PagedCollectionView PagerContext
{
get
{
if (pagerItemsCount == null)
pagerItemsCount = new List<int>();
if (_PagerContext == null)
{
PagedCollectionView pcv = new PagedCollectionView(pagerItemsCount);
pcv.PageSize = 1;
_PagerContext = pcv;
}
return _PagerContext;
}
set
{
if (PagerContext == value)
return;
_PagerContext = value;
NotifyPropertyChanged("PagerContext"); //会自动通知刷新DataPager
}
}
最后就是初始化DataPager,或者在你需要数据的地方去从服务器端获得总页数并load这个DataPager的Source了,比如这样:
MyDomainContext.GetTotalPages("123",
_PageSize, s =>
{
if (!s.HasError)
{
if (pagerItemsCount != null)
pagerItemsCount.Clear();
for (int i = 1; i <= s.Value; i++)
pagerItemsCount.Add(i);
PagedCollectionView pcv = new PagedCollectionView(pagerItemsCount);
pcv.PageSize = 1;
PagerContext = pcv; //刷新DataPager绑定的Source
SetResultsByPager(0); //强制跳转到第一页,这一步也可以省略,如果你是初始化就加载这个视图的话。
}
else
{
// 通知发生了错误
//if (LoadingCompleteFailed != null)
// LoadingCompleteFailed(this, new ResultsArgs(s.Error));
}
}, null);
整个逻辑就是:从服务器获得总页数 >> 异步完成的时候绑定到DataPager的Source >> 自动触发IndexChanged >> 从服务器端加载指定页的数据并显示 >> 用户可以任意导航上一页下一页....
这样我们在*.Xaml.cs里面没有任何代码,非常清爽的MVVM模式实现!
(注意:有人还画蛇添足绑定了DataPager的PageSize属性和CurrentIndex属性到ViewModel,根本没有必要,这些DataPager的PageIndex会自动管理当前的页码数。PageSize也没有必要设,因为我们是在服务器端计算分页数的!)
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@capbkgr.cn
文章转载自:博客园面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@capbkgr.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢