Расширители внутри списка оставляют пустое место при сворачивании

У нас довольно сложный пользовательский интерфейс, который создает для нас некоторые проблемы.

У меня есть ListBox, который содержит набор элементов данных. DataTemplate для каждого элемента равно Expander. Заголовок — это текст, содержимое Expander — это ListBox. ListBox содержит SubDataItems. The DataTemplate для каждого SubDataItem является Expander.

Вот упрощенный XAML, в котором я воспроизвожу проблему:

  <ListBox ItemsSource="{Binding Items}">
    <ListBox.ItemTemplate>
      <DataTemplate>
        <Expander Header="{Binding Header}">
          <ListBox ItemsSource="{Binding SubItems}">
            <ListBox.ItemTemplate>
              <DataTemplate>
                <Expander Header="{Binding SubHeader}">
                  <Grid Height="40">
                    <TextBlock Text="{Binding SubText}" />
                  </Grid>
                </Expander>
              </DataTemplate>
            </ListBox.ItemTemplate>
          </ListBox>
        </Expander>
      </DataTemplate>
    </ListBox.ItemTemplate>
  </ListBox>

Есть проблема с тем, как создается макет. Если какой-либо Expander, соответствующий SubDataItem, расширяется, ListBoxItem, содержащий этот ListBox (Expander.Content в родительском DataTemplate), правильно запрашивает больше места. Так я могу развернуть все SubDataItems и правильно увидеть свои данные. Однако, когда я сворачиваюсь, пространство, которое я ранее просил расширить, остается пустым, вместо того, чтобы быть восстановленным ListBoxItem.

Это проблема, потому что, если у меня есть, скажем, 10 SubDataItems и случается, что я расширяю их все одновременно, а затем сворачиваю, появляется значительное количество пустого пространства, которое тратит впустую мою недвижимость.

Как я могу заставить WPF изменить размер ListBoxItem до правильного состояния?


person Szymon Rozga    schedule 21.05.2010    source источник
comment
Почему бы просто не использовать TreeView/HierarchicalDataTemplate?   -  person Abe Heidebrecht    schedule 22.05.2010
comment
Приведенное выше упрощение описывает, по сути, как реализована наша система. Переключить его на что-то другое на данный момент не представляется возможным. Тем не менее, оцените комментарий.   -  person Szymon Rozga    schedule 22.05.2010


Ответы (1)


Пробовали ли вы использовать DockPanel в качестве ListBox для ItemsPanel вашего корня, и иметь DockPanel.Dock="Top" для каждого Expander?

person Jerry Liu    schedule 22.05.2010
comment
У меня была аналогичная проблема с ListView, и это решение сработало отлично. - person bingles; 29.09.2010