绑定到列表框,但只显示所选元素?

时间:2011-05-24 19:41:42

标签: wpf

我有一个绑定到ListBox的对象集合,但实际上我只想显示所选元素,而不是整个集合。最好的方法是什么?使用不同的控件?

我想我可以做一个Visibility ValueConverter来检查IsSelected属性 - 如果没有选择折叠......但我仍然对其他想法感兴趣。

6 个答案:

答案 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)

使用组合框而不是列表框。组合框仅显示所选项目,但您仍然可以从整个列表中选择一个项目。此外,您可以使用向上/向下移动列表。