динамическое добавление строк на основе записей в базе данных в списке mvvm mvvm light

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

Спасибо.


person Tarun    schedule 16.07.2010    source источник


Ответы (1)


Если записи имеют (или могут быть) фиксированную ширину, это легко: просто измените свой ListBox.ItemsPanel на WrapPanel и установите ширину ListBox чуть более чем в 3 раза больше ширины элементов:

<DataTemplate DataType="{x:Type my:CustomItem}">
  <Border Width="100" ...>
    ...
  </Border>
</DataTemplate>

...

<ListBox ... Width="320">
  <ListBox.ItemsPanel>
    <ItemsPanelTemplate>
      <WrapPanel/>
    </ItemsPanelTemplate>
  </ListBox.ItemsPanel>
  ...
</ListBox>

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

<ListBox ... >
  <ListBox.ItemsPanel>
    <ItemsPanelTemplate>
      <UniformGrid Width="3" />
    </ItemsPanelTemplate>
  </ListBox.ItemsPanel>
  ...
</ListBox>

Если вы хотите разделить доступную ширину на 3, чтобы получить ширину элемента, но сложить элементы как можно ближе по вертикали, это возможно, но сложно в чистом XAML. (Я бы не рекомендовал делать это в чистом XAML, но если вы хотите сделать это таким образом, вы можете создать скрытую сетку с тремя столбцами размером со звезду и столбцом с фиксированной шириной, а затем использовать привязку к ActualWidth первого столбец скрытой сетки.)

Более простой способ — создать простую пользовательскую панель, которая действует как UniformGrid по горизонтали, но как StackPanel по вертикали. Это очень простой подкласс Panel:

  • MeasureOverride вычисляет желаемую ширину как 3 * максимальную ширину любого дочернего элемента
  • MeasureOverride вычисляет желаемую высоту как сумму (max (высота каждой группы из 3))
  • ArrangeOverride размещает дочерние элементы по 3 в строке, каждая DesiredWidth/3 справа от предыдущей, а следующая строка максимально (высота) ниже текущей строки.

Очевидно, что если вы создаете пользовательскую панель, вы не будете жестко кодировать «3» — вы сделаете ее свойством, возможно, DependencyProperty, чтобы вы могли легко изменить его и чтобы при необходимости вы могли повторно использовать свою панель в другом месте.

person Ray Burns    schedule 16.07.2010
comment
@Ray.Вот мой шаблон элемента списка ‹ListBox.ItemTemplate› ‹DataTemplate› ‹StackPanel› ‹CheckBox Style={DynamicResource CheckBox_DA} IsChecked={Binding IsSelected} Content={Binding Item.ActivityName}/› ‹Label Content={Binding Item .ActivityName} HorizontalContentAlignment=Center FontSize=20›‹/Label› ‹/StackPanel› ‹/DataTemplate› ‹/ListBox.ItemTemplate› Что мне нужно изменить здесь, чтобы добиться вышеуказанного. Пожалуйста, предложите? Спасибо - person Tarun; 16.07.2010
comment
Я думаю, что любое из моих предложений применимо к этому ItemTemplate: вы можете сделать его фиксированной ширины или разделить доступную ширину. Высота останется практически неизменной, если что-то не завершится, поэтому решение UniformGrid тоже может работать хорошо. На самом деле все сводится к тому, что вы хотите, чтобы произошло при изменении размера окна и т. Д. - person Ray Burns; 16.07.2010
comment
@ Рэй. Попробую. Спасибо - person Tarun; 16.07.2010
comment
@ Рэй. Когда я попытался применить ваше предложение в моем существующем ListBox ItemTemplate, я получил следующую ошибку. «Установить свойство «System.Windows.Controls.ItemsControl.ItemsPanel» вызвало исключение». Пожалуйста, предложите? Спасибо - person Tarun; 16.07.2010
comment
Вы говорите, что применили мое предложение в моем... ItemTemplate, что меня смущает, поскольку ни один из моих кодов не устанавливает свойство ItemTemplate. Я думаю, что это, вероятно, ваша проблема: ItemsPanel следует устанавливать непосредственно в ListBox, а не в ItemTemplate. Но я не уверен в этом, так как не узнаю ошибку, которую вы получаете. Если это предположение не исправит, опубликуйте свой фактический код, чтобы я мог на него взглянуть. - person Ray Burns; 17.07.2010