WPF:如何创建自定义项目控制面板?

WPF:如何创建自定义项目控制面板?,wpf,custom-controls,itemscontrol,Wpf,Custom Controls,Itemscontrol,我想为列表框设计一个自定义项目控制面板。有3个要求: 它应该具有属性int rows和int columns,这将定义面板所用的单元格矩阵。这就是面板的外观(颜色无关,我只是想说明面板由12个3x4矩阵中的空单元格组成): 如果items控件中的项目数小于定义的单元格数,则应绘制所有单元格。例如,如果图中所示的3x4矩阵中只有4个项目,则应绘制所有单元格,其中只有4个单元格应包含这些项目 应该可以通过一些数据绑定来设置哪个单元格将承载哪个项目。例如,假设我有一个人员列表。该列表包含类型为Per

我想为
列表框
设计一个自定义项目控制面板。有3个要求:

  • 它应该具有属性
    int rows
    int columns
    ,这将定义面板所用的单元格矩阵。这就是面板的外观(颜色无关,我只是想说明面板由12个3x4矩阵中的空单元格组成):

  • 如果items控件中的项目数小于定义的单元格数,则应绘制所有单元格。例如,如果图中所示的3x4矩阵中只有4个项目,则应绘制所有单元格,其中只有4个单元格应包含这些项目

  • 应该可以通过一些数据绑定来设置哪个单元格将承载哪个项目。例如,假设我有一个人员列表。该列表包含类型为
    Person
    的项,
    Person
    类包含两个属性
    X
    Y
    。我应该能够将
    X
    数据绑定到单元格的
    ,将
    Y
    数据绑定到单元格的
    ,从而允许自己设置面板中的哪个单元格将包含列表中的哪个人


  • 如果创建项目控制面板没有意义,请推荐更好的方法。老实说,我对如何开始这件事感到困惑。谢谢你的帮助。干杯

    解决此类问题的一个有用策略是将源数据处理成更适合
    ItemsControl
    使用的格式。例如,项目的二维数组或包含其自身二维坐标的项目的线性集合很难使用

    相反,通过简单的数据结构转换,您可以将
    ItemsSource
    绑定到集合集合。外部集合包含三行,每个内部集合包含四项。每个项目都可以包含其实际行和列坐标,并可以处理相应单元格是否应显示任何数据

    下面是一个2x2示例,向您展示我的意思:

    <Grid>
        <Grid.Resources>
            <coll:ArrayList x:Key="sampleData">
                <x:Array Type="sys:String">
                    <sys:String>1</sys:String><sys:String>2</sys:String>
                </x:Array>
                <x:Array Type="sys:String">
                    <sys:String>3</sys:String<sys:String>4</sys:String>
                </x:Array>
            </coll:ArrayList>
        </Grid.Resources>
        <ItemsControl ItemsSource="{StaticResource sampleData}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <ItemsControl ItemsSource="{Binding}">
                        <ItemsControl.ItemsPanel>
                            <ItemsPanelTemplate>
                                <StackPanel Orientation="Horizontal"/>
                            </ItemsPanelTemplate>
                        </ItemsControl.ItemsPanel>
                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                <Border BorderBrush="Black" BorderThickness="1" Width="50" Height="50">
                                    <TextBlock Text="{Binding}"/>
                                </Border>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>
    

    谢谢你的回复。我正在寻找的解决方案并不是您真正提供的解决方案。我很喜欢你的想法,但有一点不起作用:在你的代码中,不可能省略元素“3”,而仍然在“2”下面放置“4”。我需要能够指定哪个元素将进入哪个矩形,您可以为任何要显示为空的单元格提供虚拟“空白”项。换句话说,总是有12个项目,即使它们都是空的。然后只需通过分配给sampleData[row][col]来填写非空白项。
    +---+---+
    | 1 | 2 |
    +---+---+
    | 3 | 4 |
    +---+---+