这一节继续完善上一节的内容,上一节只是完成了“客户管理”模块的功能主体,在真正的项目需求中,还有一些细节需要完成,比如格式化显示,详细信息的切换等。
看看我们目前的绑定结果
很帅是吧,一大堆的0,那些金额之所以显示的是比较正常,是因为我们的数据源(数据库)中就是这样的,否则显示的结果也是大片的0的。
在SL4之前,我们在绑定数据时,如果想做到格式化显示,就只能使用Converter转换器了,这个具体的使用我们在做另一个大模块(基金分析)时再介绍,现在我们看看在SL4中更简单的格式化方法“StringFormat”。
使用起来灰常简单
<sdk:DataGridTextColumn Header="第三方存管(元)" Binding="{Binding 三方存管,StringFormat=\{0:N2\}}"/>
<sdk:DataGridTextColumn Header="第三方存管占比" Binding="{Binding 三方存管占比,StringFormat=\{0:N2\}}"/>
。。。
看看格式化后的结果
如果想在后面加上单位,则可以
Binding="{Binding 三方存管,StringFormat=\{0:N2\}元}"
想显示百分比
Binding="{Binding 三方存管占比,StringFormat=p}" 注意,这样会自动计算百分比,也就是会自动剩上100
想加一些占位
Binding="{Binding 三方存管,StringFormat=\{0\,10:N2\}元}" 前占位
Binding="{Binding 三方存管,StringFormat=\{0\,-10:N2\}元}" 后占位
更多用法,可以参考《Silverlight 4常用StringFormat格式总结》
http://www.cnblogs.com/jv9/archive/2011/04/26/2028857.html
不过,也仅此而已,毕竟它只是为了我们格式化显示时更方便一些,如果想要更加强大的功能,还是要自己实现IValueConverter接口来解决,比如我们想在0的时候显示两个横线“--”,比如我们想在原值的基础上进行加减操作,比如我们想把1显示成男,把0显示成女。。。等等这些,StringFormat就显得无能为力了。
在我们的项目中还有一个小的需求
在基本信息(抱歉,上图中有错别字,呵呵)中,只显示基本的几列信息;在详细信息中,要显示全部的数据列,乍一看去,这个功能似乎比较好办,两个标签,两个表格,搞定!至少在web时,我们大多是这样来实现的,但在sl中,我们还有更好的办法!
首先想到,我们可以使用两个表格,使它们绑定到同一个数据源,在基本信息与详细信息切换时,同时切换两个表格的隐藏与显示,因为我们的数据是同一份,因此也不会产生多次请求产生的性能问题。嗯,这确实是个不错的选择,但我的项目中,我没这么用!为什么呢?因为我们第一列(选择列)使用的是模块列,它并未绑定到与其它数据相同的数据源上,而在之前我们的实现中也看到了,它其实操作的是表格控件本身,而不是它所绑定的数据源(至少在控制显示上如此),也许我们也可以有办法控制两个表格之间的同步,但我有一个更好的办法(至少我认为这个办法不错,呵呵):使用同一个表格控件,然后根据需要控制不同列的显示与隐藏状态!
把基本信息需要的列放在前面,详细信息需要的列放在后面,前三列为锁定列,可以不需要动,直接冻结住就可以了,然后在切换时
this.lnkGeneral.Click += new RoutedEventHandler(
(s, e) =>
{
for (int i = 0; i < this.dgCustomerList.Columns.Count; i++)
{
if (i < 11)
this.dgCustomerList.Columns[i].Visibility = System.Windows.Visibility.Visible;
else
this.dgCustomerList.Columns[i].Visibility = System.Windows.Visibility.Collapsed;
}
});
this.lnkAdvance.Click += new RoutedEventHandler(
(s, e) =>
{
for (int i = 3; i < this.dgCustomerList.Columns.Count; i++)
{
if (i < 11)
this.dgCustomerList.Columns[i].Visibility = System.Windows.Visibility.Collapsed;
else
this.dgCustomerList.Columns[i].Visibility = System.Windows.Visibility.Visible;
}
});
这样做了之后,基本信息与详细信息就在各自的范围内被限制住了,哪怕你通过拖动改变了列的位置也没关系!
在我们的表格列中,很自然的会有需要加入连接按钮的需要,比如为了显示一些具体信息或是跳转到其它页面等,比如我们的项目中的“账户分析”那一列,这个实现也很简单,加入模块板,数据模板绑定一个HyperlinkButton,把需要的数据绑定到HyperlinkButton的Tag属性上,然后给它加一个Click事件,在事件处理函数中,再根据取到的Tag值进行具体的处理,实现如
XAML:
<sdk:DataGridTemplateColumn Header="账户分析">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<HyperlinkButton Content="查看" Tag="{Binding FundAccount}" HorizontalAlignment="Center" VerticalAlignment="Center" Click="HyperlinkButton_Click"></HyperlinkButton>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
CS:
private void HyperlinkButton_Click(object sender, System.Windows.RoutedEventArgs e)
{
HyperlinkButton btn = sender as HyperlinkButton;
MessageBox.Show(btn.Tag.ToString());
}