如何将列表框中的“选定项目”绑定到WPF中的ItemsControl?

时间:2010-04-14 18:22:25

标签: c# wpf xaml binding itemscontrol

LowDown:我正在尝试在WPF中创建文档查看器。它将允许用户预览所选文档,如果需要,可以比较WPF中的文档。所以他们可以并排查看。

布局是这样的:左侧是一个完整的列表框。右侧是Collection或Items控件。在项目控件内部将是列表框中“选定文档”的集合。因此,用户可以在列表框中选择多个项目,并且对于他们选择的每个新项目,他们可以将项目添加到右侧的集合中。我希望该集合看起来像一个图像库,显示在Google / Bing图像搜索中。有意义吗?

我遇到的问题是我无法让WPFPreviewer正确绑定到itemscontrol下列表框中的选定项目。

旁注: WPFPreviewer是Micorosft推出的允许我们预览文档的东西。其他预览器可以为所有类型的文档构建,但我会在这里基本使用,直到我正确使用它。

我已经成功绑定到列表框而没有这里的项目控制:

<Window.Resources>
    <DataTemplate x:Key="listBoxTemplate">
        <StackPanel Margin="3" >
            <DockPanel >
                <Image Source="{Binding IconURL}" Height="30"></Image>
                <TextBlock Text="  " />
                <TextBlock x:Name="Title" Text="{Binding Title}" 
                    FontWeight="Bold" />
                <TextBlock x:Name="URL" Visibility="Collapsed" 
                    Text="{Binding Url}"/>
            </DockPanel>
        </StackPanel>
    </DataTemplate>
</Window.Resources>
<Grid Background="Cyan">
    <ListBox HorizontalAlignment="Left" 
        ItemTemplate="{StaticResource listBoxTemplate}" Width="200" 
        AllowDrop="True" x:Name="lbDocuments" 
        ItemsSource="{Binding Path=DocumentElements,ElementName=winDocument}"       
        DragEnter="documentListBox_DragEnter"  />
    <l:WPFPreviewHandler
        Content="{Binding ElementName=lbDocuments, Path=SelectedItem.Url}"/>
</Grid>

但是,一旦我添加了ItemsControl,我就无法继续使用它了:

<Window.Resources>
    <DataTemplate x:Key="listBoxTemplate">
        <StackPanel Margin="3" >
            <DockPanel >
                <Image Source="{Binding IconURL}" Height="30"></Image>
                <TextBlock Text="  " />
                <TextBlock x:Name="Title" Text="{Binding Title}" FontWeight="Bold" />
                <TextBlock x:Name="URL" Visibility="Collapsed" Text="{Binding Url}"/>
            </DockPanel>
        </StackPanel>
    </DataTemplate>
</Window.Resources>
<Grid>
    <ListBox HorizontalAlignment="Left" 
        ItemTemplate="{StaticResource listBoxTemplate}" Width="200" 
        AllowDrop="True" x:Name="lbDocuments" 
        ItemsSource="{Binding Path=DocumentElements,ElementName=winDocument}"
        DragEnter="documentListBox_DragEnter"  />
    <ItemsControl x:Name="DocumentViewer"  
        ItemsSource="{Binding ElementName=lbDocuments, Path=SelectedItem.Url}" >
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid Background="Cyan">
                    <l:WPFPreviewHandler Content="{Binding Url}"/>
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>

这是将其加载到ListBox

中的类
    public class Document
{
    public string Title { get; set; } 
    public string Url { get; set; } //this is what I want
    public string IconURL { get; set; } //used so I can display the icon of the file
}

如果我在列表框中选择一个甚至多个项目,有人可以帮助我尝试绑定到ItemsControl。

1 个答案:

答案 0 :(得分:2)

看起来错误在您的ItemsSource绑定中。目前,您正尝试将ItemsControl设置为显示SelectedItem的网址。相反,你应该绑定到SelectedItems(属性名称上的s非常重要!)属性:

...
<ItemsControl x:Name="DocumentViewer"  
    ItemsSource="{Binding ElementName=lbDocuments, Path=SelectedItems}" >
...

由于您已经有DataTemplate使用网址创建PreviewHandler,因此这应该可以满足您的需求。

修改 您需要绑定到SelectedItems,而不是SelectedItem,因为SelectedItem只是一个对象(不是有效ItemsSource),而SelectedItems是{{1}所有选中的项目。