我有一个带有DataGrid的MVVM项目,它使用具有动态列数的DataTable。 这意味着DataGrid必须自动生成其列。 我想将一个生成的DataGridTextColumn(代码中的“Col B”,typeof(PKValue))更改为DataGridComboBoxColumn。 但我无法显示列的数据。
DataTable的创建方式如下:
A = [3, 4, 6, 5, 20, 18, 10, 30]
D = 50
# sort A and repeat 6 times
A = sorted(A * 6)
# create matrix M, where:
# 0 == uncomputed, 1 == True, -1 == False
arr1d = lambda x: [0] * x
arr2d = lambda x, y: [arr1d(y) for i in xrange(x)]
arr3d = lambda x, y, z: [arr2d(y, z) for i in xrange(x)]
M = arr3d(6 + 1, len(A), D + 1)
def fill_m(bills_num, start_pos, d):
global A, M
if d == 0: # can make change for 0 only with 0 bills
return True if bills_num == 0 else False
if d < 0 or bills_num <= 0 or start_pos >= len(A):
return False
if M[bills_num][start_pos][d] == 0:
# need to compute cell value
if fill_m(bills_num, start_pos + 1, d):
M[bills_num][start_pos][d] = 1
elif fill_m(bills_num - 1, start_pos + 1, d - A[start_pos]):
M[bills_num][start_pos][d] = 1
else:
M[bills_num][start_pos][d] = -1
return M[bills_num][start_pos][d] == 1
print 'Can make change for $', D, fill_m(6, 0, D)
IDItem类:
while (i < this.ColumnsCount1)
{
dataTable.Columns.Add(new DataColumn("Col A", typeof(bool)));
i++;
dataTable.Columns.Add(new DataColumn("Col B", typeof(PKValue)));
i++;
dataTable.Columns.Add(new DataColumn("Col C", typeof(string)));
i++;
}
使用此代码 - DataGrid将“Col B”创建为DataGridTextColumn。 然后我使用此代码,尝试将自动生成的文本列更改为组合框列:
public class PKValue : ICloneable
{
public object Clone()
{
return this.MemberwiseClone();
}
public int PK { get; set; }
public string Value { get; set; }
}
DataGrid确实将“Col B”更改为DataGridComboBoxColumn而没有任何警告,正确显示ItemsSource,但它不显示该字段的现有值。 当我从下拉列表中选择一个项目时 - 它会发出警告“无法创建默认转换器来执行类型'WPFGridMatrix.Models.PKValue'和'System.String'”之间的'双向'转换。当我创建一个返回简单字符串“abc”的转换器时 - 仍然没有在列中显示任何内容。我的猜测是使用简单的“e.Column = dataGridComboBoxColumn;”是不够的,但如何正确地做到这一点?