【问题标题】:Draw a grid dynamically xaml c#动态绘制网格xaml c#
【发布时间】:2014-04-15 10:28:13
【问题描述】:

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

我已经绑定了这些:

C# // Collection.DataContext = Mycollection;

xaml // Grid.RowSpan="{Binding getSizeofcollection}"

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

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

感谢您的建议

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

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

【问题讨论】:

  • 您是否希望简单地创建一个水平项目列表?如果是这种情况,您可能需要考虑使用ItemsControl,只需将ItemsPanelTemplate 设置为StackPanelOrientation=Horizontal
  • 我有一个相同对象的列表,我希望每个对象及其属性在 DataGrid/StackPanel 或其他东西的一行中所以,20 个对象,20 行,每个属性的列

标签: c# wpf xaml gridview grid


【解决方案1】:

Grid 是布局容器,而不是控件。您想使用DataGrid,这将允许您将ItemsSource 设置为您的Mycollection。然后,您可以让它为您创建列,或者您控制并具体定义您想要的列以及它们应该如何显示。

【讨论】:

  • 与 Stackpanel 有什么区别?
  • StackPanel 也是一个布局容器。我所说的“布局容器”是指它们源自“面板”——用于布局。它们本身不会隐式保存/显示您的数据。
  • 顺便说一句,当我像这样设置项目源时,我得到一个“xaml 解析异常”:collentionGrid.ItemsSource = mycollection.CollectionAll;
  • 抱歉,刚刚注意到您将 DataContext 设置为您的集合。我倾向于使用 MVVM 模式,因此会将视图的数据上下文设置为视图模型……在该视图模型中,我将拥有一个属性,即我的集合。然后该集合将绑定到该视图上 DataGrid 的 ItemsSource。
  • awww,我的集合包含 3 个哈希表,您无法将它们绑定到数据网格...这有点复杂
【解决方案2】:

抱歉,我发现您的问题对于您的要求有点不清楚。

根据您的评论here

我有一个相同对象的列表,我希望每个对象及其属性在 DataGrid/StackPanel 或其他东西的一行中所以,20 个对象,20 行,每个属性的列

听起来您只需要一个 DataGrid。

<DataGrid x:Name="Collection" ItemsSource="{Binding }" />

DataGrid 的默认行为是为每个项目创建一个行,并为项目的每个属性自动生成一个列。因此,如果列表中有 20 个 MyClass 类型的对象,每个对象包含 3 个属性,它将自动生成一个包含 20 行和 3 列的网格。

但是,如果我误解了您,并且您实际上希望创建一个水平的 StackPanel,其中包含一行中的所有项目,并且您不需要 DataGrid 提供的选择/排序功能,我建议您使用ItemsControl 代替。

这只是一个简单的控件,它将遍历集合,并使用您指定的任何模板绘制集合中的每个项目。所有项目都包装在 &lt;ContentPresenter&gt; 中,并放置在您指定的任何布局容器中(默认为垂直 StackPanel)。

既然你说你希望所有项目都在一条水平线上,最好的ItemsPanelTemplate 可能是StackPanel,它的方向设置为Horizontal

您的 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>

【讨论】:

  • 感谢您的回答,很抱歉不清楚,我将在这里重新表述:在我的主窗口中,我创建了一个包含集合的类的实例,我将项目添加到集合中并且我想显示主窗口中数据网格中的集合之一。集合中的每一项,其属性为列。
【解决方案3】:

您可以使用一些自定义的 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 似乎更合适......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 2021-07-11
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多