ListView с вложенным Expander не сворачивается

Этот вопрос такой же, как и этот другой вопрос без ответа.

Когда Expander разворачивается, внешний ListView увеличивается, чтобы освободить место для содержимого расширителей, но когда Expander затем сворачивается, представление не заставляет ListView, размер которого нужно изменить.

Сокращенный код с примечаниями после:

<!--<StackPanel>-->
<ItemsControl>

  <!-- ParameterGroupView -->
  <Border BorderBrush="Brown" BorderThickness="1" CornerRadius="4" Padding="4">
    <ListView HorizontalContentAlignment="Stretch">
      <Expander Header="Expander A" IsExpanded="False">
        <ListView HorizontalContentAlignment="Stretch">

          <!-- TextView -->
          <TextBlock >Content A</TextBlock>
          <TextBlock >Content B</TextBlock>

        </ListView>
      </Expander>

    </ListView>
  </Border>

</ItemsControl>
<!--</StackPanel>-->

У меня есть ParameterGroupView в ItemsControl или StackPanel, потому что на самом деле записей ParameterGroupView много. Переход на StackPanel не меняет поведения.

Удаление Boarder не влияет на поведение, но его наличие помогает показать поведение только с одним ParameterGroupView.

Во внешнем ListView может быть много разделов Expander, а в Expander может быть много сущностей внутри внутреннего ListView. .

Внешний ListView и Expander должен заменить TreeView, который использовался для списка сворачиваемых узлов, но TreeView < / em> внутреннее использование сеток означает, что элементы TextView были сжаты горизонтально, так же, как если бы вы удалили атрибуты ether HorizontalContentAlignment = "Stretch".

Так что, если есть другой способ все это обернуть / связать, я тоже буду счастлив.

Это проблема, потому что наши блоки TextView большие и в них много Expander.

Изменить: TextView используется, поскольку код привязан к данным и, таким образом, динамически объединяется. Поэтому для любой замены ListView потребуется некоторая форма ItemsSource


person Simeon Pilgrim    schedule 30.11.2009    source источник
comment
Я также не хотел, чтобы стиль ListView взаимодействовал с элементами содержимого. Мне просто нужен динамический элемент управления изменением размера, который тоже можно было бы привязать.   -  person Simeon Pilgrim    schedule 30.11.2009


Ответы (2)


Нашел решение, и он уже подробно описывает, где в вопросе.

ItemControl принимает ItemsSource и автоматически меняет размер. Таким образом, замена двух ListView на ItemControl приводит к вложенному сворачиванию.

Но прокрутки нет, поэтому упаковка внешнего элемента ItemControl с помощью ScrollViewer полностью воспроизводит желаемый эффект.

<ScrollViewer
    VerticalScrollBarVisibility="Auto">
    <ItemsControl>
        <!-- ParameterGroupView -->
        <Border
            BorderBrush="Brown"
            BorderThickness="1"
            CornerRadius="4"
            Padding="4"
            Height="Auto">
            <ItemsControl
                HorizontalContentAlignment="Stretch">
                <Expander
                    Header="Expander A"
                    IsExpanded="False">
                    <ItemsControl
                        HorizontalContentAlignment="Stretch">
                        <!-- TextView -->
                        <TextBlock>Content A</TextBlock>
                        <TextBlock>Content B</TextBlock>
                    </ItemsControl>
                </Expander>
            </ItemsControl>
        </Border>
    </ItemsControl>
</ScrollViewer>

Я тестировал двойные расширители в разделах «Граница» и «Двойная граница».

person Simeon Pilgrim    schedule 30.11.2009
comment
Просто протестировал это в реальном приложении, и это также решает проблему. - person Simeon Pilgrim; 30.11.2009

Наиболее очевидная вещь, которую нужно сделать здесь, - это поместить расширители в контейнер, отличный от списка:

<Border BorderBrush="Brown" BorderThickness="1" CornerRadius="4" Padding="4">
    <StackPanel>

        <Expander Header="Expander A" IsExpanded="False">
            <ListView HorizontalContentAlignment="Stretch" MinWidth="100">
                <ListBox Name="listb"></ListBox>

                <!-- TextView -->
                <TextBlock >Content A</TextBlock>
                <TextBlock>Content B</TextBlock>

            </ListView>
        </Expander>
    </StackPanel>
</Border>

Контейнер отлично меняет размер вокруг содержимого.

Если вам абсолютно необходимо иметь его в ListView (что возможно), тогда я не знаю способа заставить ListView легко изменять размер после его роста (помимо установки явных размеров всего этого, что неуклюже и бесполезно) . Если это так, то, возможно, вам придется использовать управляемый список для отображения всех открытых расширителей или отображать контент другим способом (например, во всплывающем окне?), Если вы хотите иметь возможность его видеть. все с первого взгляда.

person MoominTroll    schedule 30.11.2009
comment
Да, я согласен, что ListBox виноват, но он мне нужен или что-то в этом роде, поскольку он поддерживает ItemsSource, а StackPanel - нет. Моя фактическая система привязана к полным данным, а не статична. - person Simeon Pilgrim; 30.11.2009