【问题标题】:Order items in a ItemsControl from right top to left bottom从右上到左下对 ItemsControl 中的项目进行排序
【发布时间】:2019-05-30 00:27:25
【问题描述】:

我正在尝试在我的 WPF 应用程序的一个视图中的 ItemsControl 中设置一个列表。

问题是我想要在控件中显示的我的项目的其他顺序。 主要,ItemsControl 从左到右和从上到下显示项目:

1  2  3  4   5   6
7  8  9  10  11  12

但是,我想以其他方式显示我的项目 - 从右上到左下 - 像这样:

11  9   7  5  3  1
12  10  8  6  4  2

我当前的 ItemsControl 是:

        Grid.Column="1"
        BorderThickness="1"
        BorderBrush="{DynamicResource WindowTitleColorBrush}">
    <ItemsControl ItemsSource="{Binding Truck.Containers}">
         <ItemsControl.ItemsPanel>
              <ItemsPanelTemplate>
                  <UniformGrid Rows="2" />
              </ItemsPanelTemplate>
          </ItemsControl.ItemsPanel>
    </ItemsControl>
</Border>

我不能只是通过在视图模型中降序来重新排序我的列表,因为它将以 12 开始并以 1 而不是 11 - 2 结束。 还有其他方法可以按我想要的顺序显示我的列表吗?

【问题讨论】:

  • 最好的方法是在 ViewModel 中按照您想要的方式对项目进行排序。
  • 解决方案的一半在 UniformGrid 上的 FlowDirection="RightToLeft" 中。另一半可以通过生成派生类来解决,如here 所述

标签: c# wpf xaml


【解决方案1】:

只是建议在代码中执行此操作:将列表拆分为偶数或奇数,按降序排列这两个列表,然后将前两个列表中的元素添加到绑定到 ItemsControl 的第三个列表中!

【讨论】:

    【解决方案2】:

    我认为您可以遵循以下 3 个解决方案之一:

    1. 在 View Model 中按您的需要排序项目

    2. 使用CollectionViewSource - 在那里进行自定义订购

    3. 创建一个自定义Panel,根据需要订购商品,并将其用作ItemsPanelTemplate。要创建自定义面板,请创建自定义类并从PanelUniformGrid 继承。比重写两个方法:

    MeasureOverride - 确定所需的面板尺寸 根据所需的子元素大小和可用的 空间。

    ArrangeOverride - 在 finally 中排列元素 可用空间。最终大小可以小于请求的大小。

    在此msdn link 和此tutorial 中了解有关自定义面板的更多信息。

    你也可以看看UniformGrid source code on msdn

    【讨论】:

      猜你喜欢
      • 2021-06-30
      • 1970-01-01
      • 2023-04-10
      • 2019-09-27
      • 2016-12-03
      • 1970-01-01
      • 2022-01-09
      • 2014-08-23
      相关资源
      最近更新 更多