Я попытался осмотреться, чтобы увидеть, не упустил ли я что-то простое, но я не могу понять, что я делаю неправильно.
У меня есть список, в котором я хотел бы привязать источник элементов к представлению коллекции фотографий из набора данных. Проблема в том, что мне нужно взять каталог, в котором находятся изображения, из MasterView CollectionView, и отдельные имена файлов из DetailView CollectionView. Итак, я определил ресурсы:
<CollectionViewSource x:Key="MasterView" />
<CollectionViewSource Source="{Binding Source={StaticResource MasterView}, Path='tblGallery_tblPictures'}" x:Key="DetailView" />
Кажется, это работает без проблем, я могу перемещаться по набору данных и видеть основные и подробные данные.
Чтобы получить полный путь к изображению, я понял, что мне нужно мультисвязывание, чтобы соединить их вместе, и успешно создал один:
<ListBox HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
ItemsSource="{Binding Source={StaticResource DetailView}}">
<ListBox.ItemTemplate>
<DataTemplate>
<Image Width="120"
Stretch="Uniform"
Margin="8,8,8,8">
<Image.Source>
<BitmapImage DecodePixelWidth="120">
<BitmapImage.UriSource>
<MultiBinding Converter="{StaticResource imagePathConverter}">
<Binding Source="{StaticResource MasterView}" Path="galleryLocation" />
<Binding Path="pictureFileName" />
</MultiBinding>
</BitmapImage.UriSource>
</BitmapImage>
</Image.Source>
</Image>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal" HorizontalAlignment="Stretch" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
Public Function Convert(ByVal values() As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IMultiValueConverter.Convert
If values.Count() <> 2 Then
Throw New InvalidOperationException("Correct Values Not Provided")
End If
Dim directory As String
Dim fileName As String
Dim imgUri As Uri = Nothing
If TypeOf values(0) Is String And TypeOf values(1) Is String Then
directory = CType(values(0), String)
fileName = CType(values(1), String)
If directory <> "" And fileName <> "" Then
If directory.LastIndexOf("/") = directory.Length - 1 Then
imgUri = New Uri(directory & fileName, UriKind.Absolute)
Else
imgUri = New Uri(directory & "/" & fileName, UriKind.Absolute)
End If
End If
End If
Return (imgUri)
End Function
Мое предположение с исходящим кодом состоит в том, что MultiBinding, который находится внутри DataTemplate, имеет доступ к BindingSource, который определяется как
ItemsSource из списка. Однако, когда я смотрю в код MultiValueConverter, он передает только данные из MasterView и общий объект для второго значения.
Чтобы посмотреть, смогу ли я заставить его работать, я добавил подробную информацию об источнике в мультисвязь:
<MultiBinding Converter="{StaticResource imagePathConverter}">
<Binding Source="{StaticResource MasterView}" Path="galleryLocation" />
<Binding Source="{StaticResource DetailView}" Path="pictureFileName" />
</MultiBinding>
Это, по крайней мере, позволило мне увидеть, что в списке было 5 картинок, но все они были одной и той же картиной. Кажется, что многосвязный доступ к DetailView CollectionView показал только первый элемент.
Есть ли способ связать «pictureFileName» с текущим элементом ItemsSource, чтобы можно было отобразить правильное изображение?
спасибо!
Josh