2011-07-21 128 views
2

我有一个对象列表。 每个对象都有一个名为“ext”的属性,用于表示文件类型。 (PDF,CSV等) 以编程方式将datagrid的itemsource绑定到对象集合之前,我使用datagridtemplatecolumn对象动态创建datagrid列。Silverlight 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行对象的扩展属性的源路径。

有没有办法做到这一点?

+0

如果您包含其他列的模板之一,这将有助于获得更好的答案,以便我们可以看到您如何绑定数据,或者代码是否在代码中执行。 – hatchet

回答

3

抓住了StringToObjectConverter代码从这个博客Yet another blog about IValueConverter

在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动态。

+0

这似乎是它会做的伎俩,但是当我添加一个“StringToObjectConverter”类与他的源,它不是解决“FirstOrDefault”作为“ResourceDictionary”的有效方法? –

+0

对此有何反应? ^^^^ –

+1

@MVelasquez:FirstOrDefault是'System.Linq'命名空间提供的扩展方法,您确定已经在您将代码复制到的文件中包含'using System.Linq;'行吗? – AnthonyWJones

1

如果”重新绑定到其他列值的模型,你可以为你正在使用的模型类创建一个部分类,只需要一个'get'来返回你想要显示的图像(基于,我假设,对于该模型的另一个属性(如docType)的值),然后您可以像缩略图列一样绑定缩略图列,您还需要ImageConverter。通过让你的属性返回一个BitmapImage而不是一个Image。有点像这样:

public BitmapSource ThumbnailBitmapSource { 
    get { 
     BitmapImage img = new BitmapImage(someUriYouGetBasedOnDocType); 
     return img; 
    } 
} 

为了让图像自动更新时DOCTYPE变化,你需要,也能实现你的局部类以下

partial void OnDocTypeChanged() { 
    this.RaiseDataMemberChanged("ThumbnailBitmapSource"); 
} 
相关问题