我有一个绑定到ListBox的对象集合,但实际上我只想显示所选元素,而不是整个集合。最好的方法是什么?使用不同的控件?
我想我可以做一个Visibility ValueConverter来检查IsSelected属性 - 如果没有选择折叠......但我仍然对其他想法感兴趣。
答案 0 :(得分:7)
由于ListBox
的整个目的是显示多个项目并为用户提供选择它们的方法,是的,我会使用不同的控件。
或者你可以这样做,这是进入愚蠢的领域:
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Style.Triggers>
<Trigger Property="IsSelected" Value="false">
<Setter Property="Visibility" Value="Collapsed"/>
</Trigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>
答案 1 :(得分:3)
虽然我同意安德斯的回答,但有一种方法只显示ListBox
中的所选项目,如果由于某种原因超出我的想象,那就是你想要做的事情:
<ListBox>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Style.Triggers>
<Trigger Property="IsSelected" Value="False">
<Setter Property="Visibility" Value="Collapsed" />
</Trigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
答案 2 :(得分:3)
你可以让WPF为你维护一个“当前项目”而不使用使用ListBox。实际上,如果我正确地读取this blog post,则在将DataContext设置为集合时会自动执行此操作。
您可以在路径表达式中使用斜杠来引用“当前集合项”。
既然你已经编写了自己的“下一个”和“上一个”按钮(大概必须已经挂钩到这个当前项目机制),你就可以消除单个项目的疯狂感。时间ListBox,只需将TextBlock(或其他)绑定到当前项的属性:
<TextBlock Text="{Binding /ItemText}"/>
答案 3 :(得分:2)
使用文本框。在您的ViewModel(我认为您绑定到它)上创建一个公开所选元素的属性(确保实现INotifyPropertyChanged
)并将文本框绑定到该属性。
答案 4 :(得分:1)
我正在尝试类似的东西并提出了这个简洁的解决方案:
<Expander Header="Elements" Name="FooExpander">
<Expander.HeaderTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding}"/>
<ListBoxItem Content="{Binding ElementName=ElementList, Path=SelectedItem}">
<ListBoxItem.Style>
<Style TargetType="ListBoxItem">
<Style.Triggers>
<Trigger Property="Content" Value="">
<Setter Property="Visibility" Value="Collapsed"/>
</Trigger>
</Style.Triggers>
</Style>
</ListBoxItem.Style>
</ListBoxItem>
</StackPanel>
</DataTemplate>
</Expander.HeaderTemplate>
<ListBox x:Name="ElementList"
SelectionChanged="SelectionChanged"
ItemsSource="{Binding Path=Foo}"
DisplayMemberPath="Name"
/>
</Expander>
private void SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) {
FooExpander.IsExpanded = ((sender as ListBox).SelectedIndex == -1);
}
也许你觉得它很有启发性。
答案 5 :(得分:0)
使用组合框而不是列表框。组合框仅显示所选项目,但您仍然可以从整个列表中选择一个项目。此外,您可以使用向上/向下移动列表。