数据绑定Xaml by Position on Datagrid

时间:2009-03-25 13:06:16

标签: wpf silverlight xaml datagrid binding

我有一个字符串数组列表作为输入。对于所有列表,数组维度都是静态的,但在检索列表之前我无法知道数组大小。 我需要在Silverlight中的数据网格中绑定列表。

我尝试在运行时创建列,将每列绑定到特定的数组位置但无法找到方法。

你知道怎么做吗?

我最终可以在数据网格中绑定的任何其他内容中“转换”我的数组列表吗?

想法是在Silverlight中的数据网格内部显示一种二维矩阵(我认为问题类似)。

列表

 column_1      column_2       column_3   ..   column_m

string[1,1]   string[1,2]    string[1,3] ..  string[1,m]
string[2,1]   string[2,2]    string[2,3] ..  string[2,m]
string[3,1]   string[3,2]    string[3,3] ..  string[3,m]
....
string[n,1]   string[n,2]    string[n,3] ..  string[n,m]

n是列表长度,m是列表列最大数字。

赞赏任何想法

2 个答案:

答案 0 :(得分:2)

我找到了两个使用Denis答案中使用模式的问题的解决方案:

  • 第一个是使用反射在运行时为绑定生成一个类,如this article中所建议的那样(感谢Vladimir Bodurov)。我已经测试了这个解决方案,我会尝试在我的项目中使用它。现在唯一的问题是,对于大型收集,性能很差。但我希望有人会在下一次解决时修复它(Silverlight 3似乎没有解决这个问题,但是)

  • 第二个解决方案将使用一些动态语言来生成数据。我不知道这是否可以更快或更快(可能不是),但最终可能有所帮助。我将来会尝试使用ironpython或ruby来生成将在datagrid中绑定的类。

如果有人尝试使用第二个解决方案或任何与运行时创建类相关的性能相关信息,我们将不胜感激。

Giorgio

答案 1 :(得分:1)

不幸的是,这并不容易。

您是否有任何有效约束,例如允许的最大列数或类似值? 如果你这样做(假设你最多有N列),你可以通过

做一些事情
  1. 有一个暴露N的班级 属性(名为Col1 ... ColN for 映射内容的示例) 列的一行数组 X
  2. 生成该类的列表, 每行一个实例
  3. 生成正确的数字 即时列,绑定每个 列属性ColX
  4. 将DataGrid绑定到该列表
  5. 这有点难看,但它会起作用。

    如果您不必依赖DataGrid,则可以使用UniformGrid。 UniformGrid是一个面板,它将其子项布局在常规网格中(每个项目具有相同的宽度,每个项目具有相同的高度)。您可以在运行时指示列数,并且面板将一个接一个地匹配子项,直到列数,然后继续在另一行上。 你可以将ItemsControl绑定到你的数组,表明它应该使用UniformGrid作为它的布局面板,并指示一个合适的ItemTemplate来呈现每个字符串。

    第二个选项要容易得多,但是你不具备DataGrid的功能,如排序,移动列,行选择,每行编辑事件等。