回答編集履歴

1 質問内容にあった、回答を追加しました。

flied_onion

flied_onion score 2622

2016/08/26 21:57  投稿

**追記しました**  
 
C#でそのxaml相当の事をしたいという事でしたね、ごめんなさい。  
 
多分以下の様にすれば行けると思います(DataGridの名前にByCodeがついてます。私が区別するためにつけただけですので適宜削除してください)。  
一応クラスライブラリ(アセンブリ名:imageDataGridのimageDataGrid.dll)を参照して表示することは確認しています。(元のXAMLも、C#も)  
 
 
```xaml  
<DataGrid x:Name="AdditionGridByCode" AutoGenerateColumns="False">  
</DataGrid>  
```  
 
```C#  
var source = new BitmapImage(new Uri("pack://application:,,,/imageDataGrid;component/Images/Ok.png", UriKind.RelativeOrAbsolute));  
 
var image = new FrameworkElementFactory(typeof(Image));  
image.Name = "Status";  
image.SetValue(Image.HeightProperty, 50.0);  
image.SetValue(Image.WidthProperty, 50.0);  
image.SetValue(Image.SourceProperty, source);  
 
var cellTemplate = new DataTemplate(typeof(DataGridTemplateColumn));  
cellTemplate.VisualTree = image;  
 
var status = new DataGridTemplateColumn();  
status.CellTemplate = cellTemplate;  
status.Header = "Status";  
 
AdditionGridByCode.Columns.Add(status);  
```  
 
ポイントは…なんでしょう。DataTemplateのtypeofに参照先の型を参照先にしてあげるのと、  
FrameworkElementFactoryを使って DataTemplateのVisualTreeにImageをElementで追加してあげるところでしょうか。  
 
XAMLで書いた場合と違ってUriが違うとエラーになってしまう点に気を付けてください。  
 
 
 
---  
 
以下、勘違いしていた時の回答。  
 
うまくいかなかったとのコメントがありましたが、私の方ではうまくいきました。  
そこがちょっと気にはなりますが、本質問と関係ないので深追いはしません。  
(Resourceと埋め込まれたリソースを間違えたとかかなぁ。ライブラリの方でやっているしそれはなさそうに思いますが。まぁ、私がちゃんと質問の意図読み取れてなかったので齟齬があったせいだと思います。)  
 
これだけだと利用イメージがつかめないですが、バインドするだけの簡単なサンプルを挙げておきます。
```xaml
<Window x:Class="tt45301DataGrid_Image.MainWindow"
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
       xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
       xmlns:local="clr-namespace:tt45301DataGrid_Image"
       mc:Ignorable="d"
       Title="MainWindow" Height="350" Width="525">
   <Grid>
       <DataGrid x:Name="AdditionGrid" AutoGenerateColumns="False">
           <DataGrid.Columns>
               <DataGridTemplateColumn Header="Status">
                   <DataGridTemplateColumn.CellTemplate>
                       <DataTemplate>
                           <Image x:Name="Status" Height="50" Width="50" Source="{Binding Path=Status}"></Image>
                       </DataTemplate>
                   </DataGridTemplateColumn.CellTemplate>
               </DataGridTemplateColumn>
           </DataGrid.Columns>
       </DataGrid>       
       
   </Grid>
</Window>
```
MainWindow.xaml.cs
```cs
using System;
using System.Collections.Generic;
using System.Windows;
namespace tt45301DataGrid_Image {
   /// <summary>
   /// MainWindow.xaml の相互作用ロジック
   /// </summary>
   public partial class MainWindow : Window {
       public MainWindow() {
           InitializeComponent();
           var list = new List<Source>();
           list.Add(new Source {
               Status = new Uri("./Resources/OK.png", UriKind.RelativeOrAbsolute)
           });
           list.Add(new Source {
               Status = new Uri("./Resources/OK.png", UriKind.RelativeOrAbsolute)
           });
           AdditionGrid.ItemsSource = list;
       }
   }
   public class Source {
       public Uri Status { get; set; }
   }
}
```
![OK.png](0b1d371eec5ad9b998c2d46ffbf5a33f.png)
※ OK.pngのプロパティ様に貼ってあった画像は削除しました。必要なら履歴から参照してください。
テキストなどもバインドするなら、ObservableCollectionも検討してみてください。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る