Привязать к списку, но показать только выбранный элемент? - PullRequest
4 голосов
/ 24 мая 2011

У меня есть коллекция объектов, которые я связываю с ListBox, но на самом деле я хочу отображать только выбранный элемент, а не всю коллекцию.Какой лучший способ пойти по этому поводу?Использовать другой элемент управления?

Я думаю, что я могу сделать Visibility ValueConverter, который проверяет атрибут IsSelected - и если не выбран, сворачивается ... но я все еще интересуюсь другими идеями.

Ответы [ 6 ]

7 голосов
/ 24 мая 2011

Поскольку цель ListBox состоит в том, чтобы отображать несколько элементов и предоставлять пользователю возможность выбирать их, да, я бы использовал другой элемент управления.

Или вы можете сделать это, попадая на территорию глупых:

<ListBox.ItemContainerStyle>
   <Style TargetType="ListBoxItem">
      <Style.Triggers>
         <Trigger Property="IsSelected" Value="false">
            <Setter Property="Visibility" Value="Collapsed"/>
         </Trigger>
      </Style.Triggers>
   </Style>
</ListBox.ItemContainerStyle>
3 голосов
/ 25 мая 2011

Вы можете заставить WPF поддерживать «текущий элемент» для вас без , используя ListBox. На самом деле, если я правильно читаю эту запись в блоге , это происходит автоматически, когда вы устанавливаете DataContext в коллекцию.

Вы можете ссылаться на «текущий элемент коллекции», используя косую черту в своем выражении Path.

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

<TextBlock Text="{Binding /ItemText}"/>
3 голосов
/ 24 мая 2011

Хотя я согласен с ответом Андерса, есть способ показать только выбранный элемент в 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 голосов
/ 24 мая 2011

Используйте текстовое поле.В вашей ViewModel (которую, я полагаю, вы привязываете) создайте свойство, открывающее выбранный элемент (обязательно реализуйте INotifyPropertyChanged), и привяжите текстовое поле к этому свойству.

1 голос
/ 22 октября 2012

Я пробовал нечто подобное и придумал это изящное решение:

<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);
}

Может быть, вы находите это вдохновляющим.

0 голосов
/ 24 мая 2011

Используйте комбинированный список вместо списка.В выпадающем списке отображается только выбранный элемент, но вы все равно можете выбрать элемент из всего списка.Также вы можете использовать вверх / вниз для перемещения по списку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...