zoukankan      html  css  js  c++  java
  • Datagrid动态绑定的数据作为图片列添加

    用RIA从数据库中获取一整个实体的数据后,首先我要选择Entities中的部分列添加到DataGrid中,但是又不想使用那种拖控件的方式,想方设法改数据源啊用Linq选择Entities的部分数据啊,都不管用,其实很简单,把DataGrid的AutoGenerateColumns设为False,然后在添加列的时候对新建的DataGridTextColumn中的Binding设为那个实体属性的字段名就可以了。。路径它可以自己找到撒~

    可是,变态的Silverlight只提供了两种通用的列和一个模板,DataGridTextColumn、DataGridCheckBoxColumn、DataGridTemplateColumn,而模板DataGridTemplateColumn的使用很多时候都是在Xaml中进行的,它下面的子元素DataTemplate没法直接在代码中使用,除非你使用资源。

    那好吧,我就使用资源。

    用资源有两种方法,可以使用StringBuilder在代码中创建一个资源,然后用XamlReader读取出来,最后DataGridTemplateColumn 的CellTemplate 赋值为XamlReader.Load(sbIcon.ToString()) as DataTemplate,其实相当纠结,因为一个字符写错了就会报错,比如:(代码用的别人的,我写的已经被我注释后删了)

    DataGridTemplateColumn colIcon = new DataGridTemplateColumn();
    StringBuilder sbIcon = new StringBuilder();
    sbIcon.Append("
    <DataTemplate ");
    sbIcon.Append("xmlns
    ='http://schemas.microsoft.com/winfx/2006/xaml/presentation' ");
    sbIcon.Append("xmlns:x
    ='http://schemas.microsoft.com/winfx/2006/xaml' ");
    sbIcon.Append("xmlns:local
    ='clr-namespace:CleverSoft.UI.SLControls;assembly=CleverSoft.UI.SLControls' ");
    sbIcon.Append("
    >");
    sbIcon.Append("
    <Grid>");
    sbIcon.Append("
    <Grid.Resources>");
    sbIcon.Append("
    <local:MessageInfoIconConverter x:Key='MessageInfoIconConverter' />");
    sbIcon.Append("
    </Grid.Resources>");
    sbIcon.Append("
    <Image Width='16' Height='16' Source='{Binding Icon, Converter={StaticResource MessageInfoIconConverter}}'/>");
    sbIcon.Append("
    </Grid>");
    sbIcon.Append("
    </DataTemplate>");
    colIcon.CellTemplate = XamlReader.Load(sbIcon.ToString()) as DataTemplate;

    当然,这个里面有个图片路径的转换函数,在下面的方法中也通用。我还是直接说第二种办法吧。

    在资源字典中添加下面代码(当然也可以直接在xaml中添加Resource,我只是把为了逻辑清晰些把他们分离出来了)

    <Customs:TypeIconConverter x:Key="TypeIconConverter"/>

    <DataTemplate x:Key="DataGridImageColumn">
    <Image Width="28" Height="28" Source="{Binding Path=Type, Converter={StaticResource TypeIconConverter}}">
    <ToolTipService.ToolTip>
    <TextBlock Text="{Binding Path=Type}"/>
    </ToolTipService.ToolTip>
    </Image>
    </DataTemplate>

    然后调用的时候就一句话(可是这句话我测试了好久才没有问题啊!!!)

    DataGridTemplateColumn dgTpColumn=new DataGridTemplateColumn();
    dgTpColumn.CellTemplate
    = (DataTemplate)Application.Current.Resources["DataGridImageColumn"];

    如果是当前xaml中的资源,直接用 (DataTemplate)Resources["DataGridImageColumn"]就可以了。

    嗯,大功告成。

    PS:其实吧,我还给那个图片添加了一个提示的~~~

    
  • 相关阅读:
    kobject.c 添加注释
    DNS之四---实现DNS的转发功能
    DNS之三-----实现DNS的TCP/UDP功能及子域委派
    DNS之二---实现DNS主从复制
    第十二周----chrony时间同步与Cobbler+PXE自动化安装
    网络时间同步服务和chrony
    第十一周----黑客加入黑名单及将普通用户授权root权限
    第十周--IP监控任务脚本实现
    ELK之十三----kibana dashboard(仪表盘)使用
    vmware虚拟机下linux centos6.6只有lo,没有eth0网卡、随机分配ip地址,固定ip地址等问题
  • 原文地址:https://www.cnblogs.com/mr0512/p/2014118.html
Copyright © 2011-2022 走看看