Silverlight Datagrid:基于对象的属性字符串动态绑定到图像源?

时间:2011-07-21 21:51:30

标签: silverlight image data-binding dynamic

我有一个对象列表。 每个对象都有一个名为“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的源路径。

有没有办法做到这一点?

2 个答案:

答案 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");
}