Отображение подробностей SelectedItem на своей стороне - PullRequest
2 голосов
/ 24 июня 2010

У меня ListView привязан к ObservableCollection<Foo>. При выборе ListViewItem я отображаю детали SelectedItem (члены Foo) в контейнере. Работает нормально.

Теперь все, что мне нужно, это отобразить детали рядом с SelectedItem. то есть, если я выберу четвертый ListViewItem, то Top контейнера должен совпадать с Top ListItem. Как бы я синхронизировал их положение, если бы это создавало какие-либо проблемы даже при прокрутке списка.

P.S: полосы прокрутки скрыты

Этот вопрос еще не решен. Кто-нибудь может помочь?

1 Ответ

1 голос
/ 24 июня 2010

Оригинальный ответ

Должна ли деталь быть в отдельном контейнере? Возможно, я неправильно понимаю ваш пример, но я бы подумал, что вы могли бы достичь того, чего хотели, добавив раздел сведений в шаблон элемента для элементов списка, а затем скрыть / показать его на основе флага IsSelected:

<ListView ItemsSource="{Binding}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <DockPanel>
                    <ContentControl DockPanel.Dock="Right" Name="DetailsControl" Content="{Binding}" ContentTemplate="{StaticResource DetailsTemplate}" />
                    <TextBlock Text="{Binding}" />
                </DockPanel>
                <DataTemplate.Triggers>
                    <DataTrigger Binding="{Binding (ListViewItem.IsSelected), RelativeSource={RelativeSource FindAncestor, AncestorType=ListViewItem}}" Value="False">
                        <Setter TargetName="DetailsControl" Property="Visibility" Value="Hidden" />
                    </DataTrigger>
                </DataTemplate.Triggers>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

Даже если вы не следите именно за этим поведением, я думаю, вы могли бы приблизиться к тому, что вы хотите, заменив ContentControl из примера на что-то другое (например, всплывающее окно)


Редактировать в ответ на комментарии

Пример ниже поместит Popup справа от ListView, который виден только для выбранного элемента:

<ListView ItemsSource="{Binding}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <DockPanel>
                <TextBlock Text="{Binding}" />

                <Popup Placement="Right"
                        PlacementTarget="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListViewItem}}"
                        IsOpen="{Binding (ListViewItem.IsSelected), RelativeSource={RelativeSource FindAncestor, AncestorType=ListViewItem}}">

                    <Border Background="Black" Padding="3">
                        <TextBlock Text="{Binding}" />
                    </Border>
                </Popup>

            </DockPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

При этом используется атрибут Placement, чтобы указать, что Popup должен отображаться справа от целевого элемента, и привязывается свойство PlacementTarget к первому предку типа ListViewItem (то есть к родительскому контейнеру).

Это вызывает появление, как в примере ниже:

working example

...