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。
答案 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}所有选中的项目。