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

Wpf 绑定到列表框,但仅显示所选元素?,wpf,Wpf,我有一个绑定到列表框的对象集合,但实际上我只想显示选定的元素,而不是整个集合。最好的办法是什么?使用不同的控件 我想我可以做一个Visibility ValueConverter来检查IsSelected属性,如果没有选中,就会折叠。。。但我仍然对其他想法感兴趣。使用文本框。在您的ViewModel上,我认为您正在绑定以创建一个公开所选元素的属性,请确保实现INotifyPropertyChanged并将文本框绑定到该属性。由于列表框的全部目的是显示多个项目并为用户提供选择它们的方法,是的,我将

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


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

使用文本框。在您的ViewModel上,我认为您正在绑定以创建一个公开所选元素的属性,请确保实现INotifyPropertyChanged并将文本框绑定到该属性。

由于列表框的全部目的是显示多个项目并为用户提供选择它们的方法,是的,我将使用不同的控件

或者你可以这样做,这是进入愚蠢的领域:

<ListBox.ItemContainerStyle>
   <Style TargetType="ListBoxItem">
      <Style.Triggers>
         <Trigger Property="IsSelected" Value="false">
            <Setter Property="Visibility" Value="Collapsed"/>
         </Trigger>
      </Style.Triggers>
   </Style>
</ListBox.ItemContainerStyle>

虽然我同意Anders的回答,但有一种方法可以在列表框中仅显示所选项目,如果出于超出我想象的原因,您确实希望这样做:

<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>

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

您可以让WPF在不使用列表框的情况下为您维护当前项目。事实上,如果我阅读正确,当您将DataContext设置为集合时,它会自动执行此操作

可以通过在路径表达式中使用斜杠来引用当前集合项

由于您已经编写了自己的“下一个”和“上一个”按钮,这些按钮可能已经钩住了当前项机制,因此您可以摆脱一次一项列表框的疯狂,只需将文本块或任何内容绑定到当前项的属性:

<TextBlock Text="{Binding /ItemText}"/>

我尝试了类似的方法,并提出了一个简洁的解决方案:

<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>

也许你会觉得很有启发性。

所以你只想在你的列表框中显示一个ListBoxItem?@smoore是的,但是用户可以用[上一步]和[下一步]按钮更改所选项目。只是出于好奇,如果您没有列出要从中选择的多个项目,那么使用列表框有什么好处?@smoore可观察集合将从WCF异步序列化而来。因此,如果我只是绑定到一个元素,那么当列表更新时,我似乎必须执行一些丑陋的后端代码。这不是他们所说的组合框吗?
private void SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) {
    FooExpander.IsExpanded = ((sender as ListBox).SelectedIndex == -1);
}