【问题标题】:Dynamic column binding in XamlXaml 中的动态列绑定
【发布时间】:2010-12-17 17:07:42
【问题描述】:

这是之前帖子 (here) 的后续问题。

我有一些“标题”信息存储为: Dictionary<string,string> - 第一个字符串表示字段名称,第二个字符串表示我要显示的标题。

我有一组动态数据存储为: Dictionary<string, object> - 其中字符串是字段名称。

我在 xaml 中将其绑定为:

<data:DataGrid Name="_dataGrid" AutoGenerateColumns="True"  IsReadOnly="False" Margin="5" Height="200">
            <data:DataGrid.Columns>
                <data:DataGridTextColumn Header="Forename" CanUserSort="True" SortMemberPath="Forename" 
                                          Binding="{Binding Converter={StaticResource RowIndexConverter},
                                            ConverterParameter=Forename}"/>
                <data:DataGridTextColumn Header="Surname" CanUserSort="True" SortMemberPath="Surname" 
                                         Binding="{Binding Converter={StaticResource RowIndexConverter},
                                            ConverterParameter=Surname}"/>
                <data:DataGridTextColumn Header="Age" CanUserSort="True" SortMemberPath="Age" 
                                         Binding="{Binding Converter={StaticResource RowIndexConverter},
                                            ConverterParameter=Age}"/>
                <data:DataGridTextColumn Header="Shoesize" CanUserSort="True" SortMemberPath="Shoesize" 
                                         Binding="{Binding Converter={StaticResource RowIndexConverter},
                                            ConverterParameter=Shoesize}"/>                
            </data:DataGrid.Columns>
        </data:DataGrid> 

问题 1 我想自动生成这些列(使用提供的标题信息)

问题 2 我希望根据它们的数据类型生成列(即 boolean = checkbox)

问题 3 理想情况下,我还想通过数据绑定指定天气按钮是否应该存在于第一列(即编辑/查看按钮)

【问题讨论】:

    标签: xaml silverlight dynamic


    【解决方案1】:

    我使用了一种遵循此伪代码模式的方法

    columns = New DynamicTypeColumnList()
    columns.Add(New DynamicTypeColumn("Name", GetType(String)))
    dynamicType = DynamicTypeHelper.GetDynamicType(columns)
    

    DynamicTypeHelper.GetDynamicType() 生成具有简单属性的类型。有关如何生成此类类型的详细信息,请参阅this post

    然后要实际使用该类型,请执行以下操作

    Dim rows as List(Of DynamicItem)
    Dim row As DynamicItem = CType(Activator.CreateInstance(dynamicType), DynamicItem)
    row("Name") = "Foo"
    rows.Add(row)
    dataGrid.DataContext = rows
    

    【讨论】:

    • 很明显,这个解释中遗漏了很多细节,但它应该会让你走上正确的道路。
    • 啊,是的 - 我以前研究过 Vladimir Bodurov 的方法。它真的很酷。但是,我的问题是动态类型生成意味着您不能在设计时使用强类型(并且运行时调试返回空值)。 Colin 在这里有一个很好的帖子:scottlogic.co.uk/blog/colin/2009/04/… 这解释了一种更“标准”的做事方式。与不同控件一起使用时需要进行一些调整,但 c# 代码是一个非常优雅的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    相关资源
    最近更新 更多