2013-08-16 3 views
0

Я хочу привязать список изображений к стеке, который находится внутри DataGrid.RowDetailsTemplate. Моя классовая структура выглядит следующим образом:Привязать список изображений к 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; } 
} 

В моем главном классе у меня есть список A:

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

Все, что я хочу сделать, это отобразить имя свойства элемента в DataGridTextColumn и все изображения, хранящиеся в свойстве «Изображения» в RowDetails.

Мой 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(); 
    } 
} 
Смежные вопросы