我有一个绑定到ObservableCollection<Foo>
的ListView。在选择ListViewItem时,我在容器中显示SelectedItem(Foo成员)的详细信息。它工作正常。
现在我想要的只是显示SelectedItem旁边的细节。即,如果我选择第四个ListViewItem,那么Container的Top应该与ListViewItem的Top相同。如果在滚动列表时它应该产生任何问题,我将如何同步它们的位置。
P.S:隐藏滚动条
此问题尚未解决。有人可以帮忙吗?
答案 0 :(得分:1)
原始答案
细节是否需要在一个单独的容器中?我可能误解了你的例子,但我认为你可以通过将详细信息部分添加到列表项的项目模板然后根据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
属性绑定到类型{{1}的第一个祖先(即父容器)。
这会导致外观如下例所示: