zoukankan      html  css  js  c++  java
  • SilverLight之路(八)

    这一节继续完善上一节的内容,上一节只是完成了“客户管理”模块的功能主体,在真正的项目需求中,还有一些细节需要完成,比如格式化显示,详细信息的切换等。

    看看我们目前的绑定结果

     

    很帅是吧,一大堆的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());
    }
  • 相关阅读:
    nodejs初期,搭建一个登陆注册功能,(原生的)
    关于vue如何创建一个自定义组件(这是项目中经常得用的)
    关于vue 使用watch方法,详解。
    怎样用Nodejs搭建一个服务器
    关于Promise的理解及运用
    Ado.NET SQLHelper(2)
    Ado.NET SQLHelper
    MS SQLSERVER 自增ID列竟然会重复
    SQL中Left Join 与Right Join 与 Inner Join 与 Full Join的区别
    thread.start和threadstart.invoke的区别
  • 原文地址:https://www.cnblogs.com/meteortent/p/2080448.html
Copyright © 2011-2022 走看看