我有一个想要放在网格上的集合。集合项目的属性是指项目应该放置在网格上的哪个位置,以及项目应该跨越多少列和多少行。所以这个项目看起来像这样:
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
提前致谢!