События WPF Listbox + Expander

Я склонен использовать возврат урожая, когда я вычисляю следующий объект в списке (или даже следующая группа объектов).

Используя Вашу Версию 2, у Вас должен быть полный список перед возвратом. При помощи возврата урожая у Вас действительно только должен быть следующий объект перед возвратом.

Среди прочего, это помогает распространить вычислительную стоимость сложных вычислений за больший период времени. Например, если список сцепляется до GUI, и пользователь никогда не переходит к последней странице, Вы никогда не вычисляете заключительные объекты в списке.

Другой случай, где возврат урожая предпочтителен, - то, если IEnumerable представляет бесконечное множество. Рассмотрите список Простых чисел или бесконечный список случайных чисел. Вы никогда не можете возвращать полный IEnumerable сразу, таким образом, Вы используете возврат урожая для возврата списка инкрементно.

В Вашем конкретном примере, у Вас есть полный список продуктов, таким образом, я использовал бы Версию 2.

5
задан IUnknown 25 July 2009 в 23:18
поделиться

3 ответа

Альтернативный способ, который не зависит от IsSelected. Вы можете привязать событие Expanded / Collapsed расширителя к коду позади и использовать следующий код, чтобы узнать индекс ListBox, по которому вы щелкнули.

DependencyObject dep = (DependencyObject)e.OriginalSource;

while ((dep != null) && !(dep is ListViewItem))
{
   dep = VisualTreeHelper.GetParent(dep);
}

if (dep == null)
     return;

int index = yourListBox.ItemContainerGenerator.IndexFromContainer(dep);
1
ответ дан 14 December 2019 в 19:21
поделиться

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

 <Expander IsExpanded="{Binding IsSelected,Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}">

ОБНОВЛЕНИЕ: Если вам нужно избежать автоматического сворачивания при выборе другого элемента, сделайте режим выбора из списка множественным.

<ListBox SelectionMode="Multiple"
4
ответ дан 14 December 2019 в 19:21
поделиться

Спасибо, Джоби. Это довольно умно. Кроличья нора WPF становится все глубже и глубже.

Вот что я сделал на основе вашего предложения:

private void Expander_Expanded(object sender, RoutedEventArgs e) {
    DependencyObject dep = (DependencyObject)sender;

    while ((dep != null) && !(dep is ListBoxItem)) {
        dep = VisualTreeHelper.GetParent(dep);
    }

    if (dep == null)
        return;

    int index = PersonList.ItemContainerGenerator.IndexFromContainer(dep);

    PersonList.SelectedIndex = index;
}

private void Expander_Collapsed(object sender, RoutedEventArgs e) {
    DependencyObject dep = (DependencyObject)sender;

    while ((dep != null) && !(dep is ListBoxItem)) {
        dep = VisualTreeHelper.GetParent(dep);
    }

    if (dep == null)
        return;

    int index = PersonList.ItemContainerGenerator.IndexFromContainer(dep);

    if (PersonList.SelectedIndex == index)
        PersonList.SelectedIndex = -1;
}

Мне пришлось изменить ListViewItem на ListBoxItem (я использовал ListBox).

Кроме того, я использовал индекс для выбора или отмены выбора ListBox.SelectedIndex. Это дало мне опыт, который я искал.

  1. В первый раз, когда кто-то разворачивает Expander, он выбирает только что развернутый ListBoxItem.

  2. Если кто-то расширяет другой Expander, предыдущий ListBoxItem отменяется, но остается развернутым, выбирается только что развернутый ListBoxItem.

  3. Если кто-то сворачивает для выбранного Expander, ListBoxItem не выбран.

  4. Если несколько Expanders развернуты, кто-то сворачивает невыбранный Expander ListBoxItem, ранее выбранный ListBoxItem остается выбранным.

0
ответ дан 14 December 2019 в 19:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: