动态绘制一个网格xaml c#
本文关键字:一个 网格 xaml 绘制 动态 | 更新日期: 2023-09-27 17:58:27
我想要xaml中的一个网格,它可以向我显示对象的集合,我应该如何进行?
我已经绑定了这些:
C# // Collection.DataContext = Mycollection;
xaml // Grid.RowSpan="{Binding getSizeofcollection}"
我的收藏包含所有相同类型的对象。我想显示1个对象/行
可以创建一个如何在一行中显示对象的模板,然后在网格中使用它吗?
谢谢你的建议
编辑:事实上,我不能绑定到哈希表,但我可以绑定到列表这就是我问题的根源。现在我正在尝试在列表中转换我的哈希表
编辑n°2:好的,我正确地将哈希表转换为列表,但这个xamlparse异常仍然存在
Grid
是布局容器,而不是控件。您想要使用DataGrid
,这将允许您将ItemsSource
设置为Mycollection
。然后,您可以让它为您创建列,也可以控制并具体定义您想要的列以及它们应该如何显示。
对不起,我发现你的问题有点不清楚你在问什么。
根据您在这里的评论
我有一个相同对象的列表,我希望每个对象和它们的属性都在DataGrid/StackPanel的一行中,或者其他什么。所以,20个对象,20行,每个属性的一个collmn
听起来你只是想要一个DataGrid。
<DataGrid x:Name="Collection" ItemsSource="{Binding }" />
DataGrid
的默认行为是为每个项创建一个Row,并为该项的每个属性自动生成一列。因此,如果列表中有20个类型为MyClass
的对象,并且每个对象都包含3个属性,那么它将自动生成一个包含20行3列的网格。
但是,如果我误解了你的意思,你实际上想创建一个水平的StackPanel,其中包含一行中的所有项目,并且你不需要DataGrid提供的选择/排序功能,我建议你使用ItemsControl。
这只是一个控件,它将遍历集合,并使用指定的任何模板绘制集合中的每个项。所有项目都封装在<ContentPresenter>
中,并放置在您指定的任何布局容器中(默认为垂直StackPanel)。
由于您说过希望所有项目都在水平行中,因此最好的ItemsPanelTemplate
可能是方向设置为Horizontal
的StackPanel
。
你的XAML最终会变成这样:
<ItemsControl x:Name="Collection" ItemsSource="{Binding }">
<!-- ItemsPanelTemplate -->
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<!-- ItemTemplate -->
<ItemsControl.ItemTemplate>
<DataTemplate>
<!-- // put whatever XAML you want to use to draw each item here -->
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
您可以使用一些自定义AttachedProperty。
类似这样的东西:
<Grid Grid.Row="1"
commonUI:GridExtension.ItemsSource="{Binding ItemsSource}"
commonUI:GridExtension.Rows="{Binding RowDefinitions}"
commonUI:GridExtension.Columns="{Binding ColumnDefinitions}"/>
对于文档:http://msdn.microsoft.com/en-us/library/ms749011(v=vs.110).aspx
但在您的情况下,简单的ListBox或ItemsControl似乎更合适。。。