WPF - мультисвязывание из двух источников внутри шаблона данных ListBox - PullRequest
2 голосов
/ 13 мая 2009

Я попытался осмотреться, чтобы увидеть, не упустил ли я что-то простое, но я не могу понять, что я делаю неправильно.

У меня есть список, в котором я хотел бы привязать источник элементов к представлению коллекции фотографий из набора данных. Проблема в том, что мне нужно взять каталог, в котором находятся изображения, из 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

...