动态绘制一个网格xaml c#

本文关键字:一个 网格 xaml 绘制 动态 | 更新日期: 2023-09-27 17:58:27

我想要xaml中的一个网格,它可以向我显示对象的集合,我应该如何进行?

我已经绑定了这些:

C# // Collection.DataContext = Mycollection;
xaml // Grid.RowSpan="{Binding getSizeofcollection}"

我的收藏包含所有相同类型的对象。我想显示1个对象/行

可以创建一个如何在一行中显示对象的模板,然后在网格中使用它吗?

谢谢你的建议

编辑:事实上,我不能绑定到哈希表,但我可以绑定到列表这就是我问题的根源。现在我正在尝试在列表中转换我的哈希表

编辑n°2:好的,我正确地将哈希表转换为列表,但这个xamlparse异常仍然存在

动态绘制一个网格xaml c#

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可能是方向设置为HorizontalStackPanel

你的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似乎更合适。。。