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:其实吧,我还给那个图片添加了一个提示的~~~


原文地址:https://www.cnblogs.com/mr0512/p/2014118.html