2

我有一个想要放在网格上的集合。集合项目的属性是指项目应该放置在网格上的哪个位置,以及项目应该跨越多少列和多少行。所以这个项目看起来像这样:

public class Item
{
    public int FromRow { get; set; }
    public int SpanRow { get; set; }
    public int FromColumn { get; set; }
    public int SpanColumn { get; set; }
}

我希望网格为集合动态生成正确数量的列和行,并显示其中每个项目的集合槽数据模板。我相信我已经解决了这部分问题,如下所示:

<ItemsControl ItemTemplate="{StaticResource ItemTemplate}"
              ItemsSource="{Binding ItemCollection">
  <ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
      <Grid x:Name="Grid"
            ShowGridLines="True"
            dataHelper:DynamicGrid.RowCount="7"
            dataHelper:DynamicGrid.ColumnCount="{Binding ColumnCount}"
            dataHelper:DynamicGrid.ColumnWidth="{Binding ColumnWidth}">
      </Grid>
    </ItemsPanelTemplate>
  </ItemsControl.ItemsPanel>
  <ItemsControl.ItemContainerStyle>
    <Style>
      <Style.Setters>
        <Setter Property="Grid.Row"
                Value="{Binding FromRow}" />
        <Setter Property="Grid.Column"
                Value="{Binding FromColumn}" />
        <Setter Property="Grid.RowSpan"
                Value="{Binding SpanRow}" />
        <Setter Property="Grid.ColumnSpan"
                Value="{Binding SpanColumn}" />
      </Style.Setters>
    </Style>
  </ItemsControl.ItemContainerStyle>
</ItemsControl>

如您所见,我正在为动态网格部分使用附加属性。但是有两个问题我想不通。

第一个问题:我想在填充网格的项目上启用拖放功能,以便我可以操纵网格上的项目位置。现在我需要放置应该准确的鼠标位置。我四处搜寻,发现了这个:

private void OnMouseMove(object sender, MouseEventArgs e)
{
    var element = (UIElement)e.Source;

    int c = Grid.GetColumn(element);
    int r = Grid.GetRow(element);
}

这意味着网格必须在每个单元格中都有 UIElements,但是 ItemsControl 不允许我向网格添加任何可以理解的内容。

第二个问题:我希望行和列具有迭代标题。我的意思是,第一列的第一个单元格中有“1”,第二列的第一个单元格中有“2”,依此类推。行也是如此。

我希望我已经解释了我的问题,以便你们理解它们。任何输入将不胜感激。如果您知道执行我所解释的更好的方法,除了 ItemsControl 中的普通网格之外的其他工具,请分享!:D

提前致谢!

4

0 回答 0