根据listbox mvvm mvvm light中数据库中的记录动态添加行

时间:2010-07-16 03:30:25

标签: wpf mvvm wpf-controls mvvm-light

我有一个列表框,我在其中显示数据库中的记录。它一个接一个地在一个列中。如何将记录按顺序排列为3行3列,即连续3行记录,连续3行记录之后。请建议吗?

感谢。

1 个答案:

答案 0 :(得分: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>

如果您需要将可用宽度除以3并且您知道所有项目的高度完全相同(或者如果您的所有行都是任何项目的最大高度都可以),那么非常简单使用UniformGrid但没有指定高度的解决方案:

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

如果要将可用宽度除以3以获得项目宽度,但是尽可能垂直地堆叠项目,则纯XAML中可能会很棘手。 (我不建议在纯XAML中使用它,但如果你想这样做,你可以创建一个隐藏的网格,其中包含三个星大小的列和一个固定宽度的列,然后使用绑定到第一个的ActualWidth隐藏网格的列。)

更简单的方法是创建一个简单的自定义面板,其水平方向与UniformGrid相同,但垂直方向与StackPanel相同。这是一个非常简单的Panel子类:

  • MeasureOverride计算所需宽度为任何孩子的3 *最大宽度
  • MeasureOverride计算所需高度为总和(最大值(每组3的高度))
  • ArrangeOverride每行排列3个孩子,每个DesiredWidth / 3放在前一个孩子的右边,下一行是从当前行开始的最大(高度)

显然,如果你设计一个自定义面板你不会硬编码“3” - 你会把它变成一个属性,可能是DependencyProperty,所​​以你可以轻松地改变它,以便你可以在其他地方重用你的面板是