2

我想将图像列表绑定到 DataGrid.RowDetailsTemplate 内的堆栈面板。我的班级结构如下:

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 属性中存储的所有图像。

我的xml是:

<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>

我所看到的只是一张图像,尽管图像中存储了更多图像。有任何想法吗?

4

1 回答 1

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();
    }
}
于 2013-08-19T22:16:06.440 回答