WPF - 从ListBox DataTemplate中的两个源进行多重绑定

时间:2009-05-13 11:13:49

标签: wpf image binding listbox itemssource

我试着环顾四周,看看我是否遗漏了一些基本的东西,但我似乎无法理解我做错了什么。

我有一个列表框,我想将itemssource绑定到数据集中照片的集合视图。问题是,我需要从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

我对正在进行的代码的假设是,DataTemplate内部的MultiBinding可以访问定义为的BindingSource。 列表框中的ItemsSource。但是,当我查看MultiValueConverter代码时,它只传递MasterView中的数据和第二个值的通用对象。

为了了解我是否可以使用它,我在multibinding中添加了详细信息源信息:

<MultiBinding Converter="{StaticResource imagePathConverter}">
  <Binding Source="{StaticResource MasterView}" Path="galleryLocation" />
  <Binding Source="{StaticResource DetailView}" Path="pictureFileName" />
</MultiBinding>

至少让我看到列表框中有5张图片,但它们都是相同的图片。似乎对DetailView CollectionView的多绑定访问只显示了第一个项目。

有没有办法将“pictureFileName”链接到当前的ItemsSource项目,以便显示正确的图片?

谢谢!

约什

0 个答案:

没有答案