2013-08-16 50 views
0

我想將圖像列表綁定到DataGrid.RowDetailsTemplate內部的stackpanel。 我的類結構如下:將圖像列表綁定到StackPanel

public class A 
{ 
    private List<MyImage> _images = new List<MyImage>(); 
    public List<MyImage> Images { get; set; } 
    public string Name { get; set; } 

    public void AddImage(byte[] src) { ... } 
} 

public class MyImage 
{ 
    public BitmapImage Image { get; set; } 
    public byte[] RawData { get; set; } 
} 

在我的主類我有一個列表:

public List<A> AList { get; set; } 
dataGrid1.ItemsSource = AList; 
dataGrid1.DataContext = AList; 

所有我想要做的就是在DataGridTextColumn顯示元素的名稱屬性以及存儲在RowDetails的Images屬性中的所有圖像。

我的XAML是:

<DataGrid name="dataGrid1"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Name" Binding="{Path=Name}"/> 
    </DataGrid.Columns> 
    <DataGrid.RowDetailsTemplate> 
     <DataTemplate> 
      <StackPanel DataContext="{Binding Path=Images}"> 
       <Image Source="{Binding Path=RawData}"/> 
      </StackPanel> 
     </DataTemplate> 
    </DataGrid.RowDetailsTemplate> 

所有我能看到只是一個圖片雖然有更多的一些存儲在圖像。有任何想法嗎?

回答

0

好吧,所以這個問題的解決方案是使用ContentPresenter與轉換器結合使用。

現在我的XAML看起來像這樣:

<DataGrid name="dataGrid1"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Name" Binding="{Path=Name}"/> 
    </DataGrid.Columns> 
    <DataGrid.RowDetailsTemplate> 
     <DataTemplate> 
      <ContentPresenter Content="{Binding Images, Converter={StaticResource ImageCollectionConverter}}"/> 
     </DataTemplate> 
    </DataGrid.RowDetailsTemplate> 
</DataGrid> 

以及相應的轉換器類:

public class ImageCollectionConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     List<MyImage> images = value as List<MyImage>; 

     if (images != null) 
     { 
      StackPanel stack = new StackPanel(); 
      stack.Orientation = Orientation.Horizontal; 

      foreach (DesignImage img in images) 
      { 
       Image image = new Image(); 
       image.Source = img.Image; 

       stack.Children.Add(image); 
      } 

      return stack; 
     } 

     return null; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
}