Как привязать «выбранный элемент» в списке к ItemControl в WPF? - PullRequest
1 голос
/ 14 апреля 2010

LowDown: я пытаюсь создать Средство просмотра документов в WPF. Это позволит пользователю предварительно просмотреть выбранные документы и, если они захотят, сравнить документы в WPF. Чтобы они могли видеть их рядом.

Схема такая: Левая сторона - это полный список. Справа находится элемент управления Коллекция или Предметы. Внутри элемента управления будет набор «выбранных документов» в списке. Таким образом, пользователь может выбрать несколько элементов в списке и для каждого нового элемента, который он выбирает, он может добавить элемент в коллекцию справа. Я хочу, чтобы коллекция выглядела как галерея изображений, которая отображается в поиске картинок Google / Bing. Имеет смысл?

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу заставить WPFPreviewer правильно связываться с выбранным элементом в списке в списке элементов

Примечание: 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 Ответ

2 голосов
/ 15 апреля 2010

Похоже, ошибка в вашей ItemsSource привязке. В настоящее время вы пытаетесь установить ItemsControl для отображения URL-адреса SelectedItem. Вместо этого вам следует просто связать свойство SelectedItems (s в имени свойства действительно важно!):

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

Поскольку у вас уже есть DataTemplate, который использует URL для создания PreviewHandler, это должно сделать то, что вам нужно.

Редактировать Вам необходимо связать с SelectedItems, а не с SelectedItem, поскольку SelectedItem - это только один объект (не действительный ItemsSource), тогда как SelectedItems - это IEnumerable из всех выбранных элементов.

...