我有一个对象列表。 每个对象都有一个名为“ext”的属性,表示文件类型。 (PDF,CSV等) 在将datagrid的itemsource绑定到对象集合之前,我以编程方式使用datagridtemplatecolumn对象动态创建datagrid列。
我有一个基本上是图像的DataTemplate资源:
<DataTemplate x:Key="imageThumb">
<Image x:Name="docImage" Width="25" Height="25" Source="/MyApp;component/images/pdf-icon.png">
<Image.Effect>
<DropShadowEffect ShadowDepth="1" BlurRadius="1" Opacity="0.5"/>
</Image.Effect>
</Image>
</DataTemplate>
然后在我的代码后面动态创建datagrid模板列:
DataTemplate imageTemplate = (DataTemplate)this.Resources["imageThumb"];
DataGridTemplateColumn docType = new DataGridTemplateColumn();
docType.Header = "Doc Type";
docType.CellTemplate = imageTemplate;
targetDataGrid.Columns.Add(docType);
当我将其设置为datagridtemplate列的单元格模板时,一切都很好,但显然每一行在列中都有一个PDF图标。 我想根据绑定到datagrid行的对象的扩展属性动态更改此Image的源路径。
有没有办法做到这一点?
答案 0 :(得分:3)
从此博客Yet another blog about IValueConverter
中抓取StringToObjectConverter
的代码
在您的Xaml资源中,在StringToObjectConverter
中设置您的已知图标图像集,如下所示:
<local:StringToObjectConverter x:Key="DocTypeToBitmap">
<ResourceDictionary>
<BitmapImage x:Key="pdf" UriSource="/MyApp;component/images/pdf-icon.png" />
<!-- Other BitmapImages here -->
<BitmapImage x:Key="__default__" UriSource="/MyApp;component/images/unknown-icon.png" />
</ResourceDictionary>
</local:StringToObjectConverter>
(如果您愿意,您当然可以通过编程方式填写此BitmapImages列表。)
现在你可以在你的
中使用这个转换器<DataTemplate x:Key="imageThumb">
<Image x:Name="docImage" Width="25" Height="25" Source="{Binding docType, Converter={StaticResource DocTypeToBitmap}}">
<Image.Effect>
<DropShadowEffect ShadowDepth="1" BlurRadius="1" Opacity="0.5"/>
</Image.Effect>
</Image>
</DataTemplate>
现在,图片会跟踪docType
动态更改。
答案 1 :(得分:1)
如果要绑定到其他列值的模型,则可以为正在使用的模型类创建分部类。写一个只有'get'的属性,返回你想要显示的图像(我假设,基于该模型的另一个属性的值,如docType)。然后,您可以像其他列一样绑定缩略图列。你还需要一个ImageConverter。
您可以通过让属性返回BitmapImage而不是Image来跳过对ImageConverter的需求。有点像这样:
public BitmapSource ThumbnailBitmapSource {
get {
BitmapImage img = new BitmapImage(someUriYouGetBasedOnDocType);
return img;
}
}
要在docType更改时自动更新图像,您还需要在分部类中实现以下内容
partial void OnDocTypeChanged() {
this.RaiseDataMemberChanged("ThumbnailBitmapSource");
}