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