将图像列表绑定到StackPanel

时间:2013-08-16 11:24:32

标签: image list bind stackpanel

我想将图像列表绑定到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中显示元素的Name属性,并在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>

所有我看到的只是一张图片,尽管图片中还有更多的图片。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

好的,所以解决这个问题的方法是使用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();
    }
}