我有一个DataGrid
.
它里面包含一些列;2 与这个问题有关,一个是DataGridTextColumn
( x:Name="varTypeColumn"
) 显示变量类型,另一个是DataGridTemplateColumn
( x:Name="varValueColumn"
) 可以是 TextBox 或 ComboBox 里面。
如果varTypeColumn
是 Bool 类型,varValueColumn
则应显示ComboBox
包含 2 项的 a:True
, False
. 如果varTypeColumn
是Int
类型,varValueColumn
应该显示一个允许用户输入字符串的文本框。
所以我的问题是,是否有可能做到这一点xaml
?我找到了一些在代码中执行此操作的实现.cs
,它尝试获取 Row 并获取 Cell,最后将 TextBox/ComboBox 实例设置为 Cell 的 Content 属性。它可以工作,但如果 DataGrid 包含大量项目(例如,超过 5000 个),则显示它非常非常慢。
下面是代码部分:
private void InitEditors()
{
for (int i = 0; i < _devLinkCollectionView.Count; i++)
{
DataGridRow row = devLinkDataGrid.GetRow(i);
InitEditor(row);
}
}
private void InitEditor(DataGridRow row)
{
DevLink link = row.Item as DevLink;
if (link != null)
{
if (link.HasErrors)
{
ToolTipService.SetShowOnDisabled(row, true);
row.IsEnabled = false;
return;
}
// Create binding first
Binding binding = new Binding("DefaultValue")
{
Mode = BindingMode.TwoWay,
UpdateSourceTrigger = UpdateSourceTrigger.LostFocus,
Source = link
};
DataGridCell cell = devLinkDataGrid.GetCell(row, 4);
switch (link.VariableType)
{
case CarelStandardDataType.Bool:
ComboBox comboBox = new ComboBox();
comboBox.ItemsSource = new[] {string.Empty, "TRUE", "FALSE" };
comboBox.SetBinding(ComboBox.SelectedValueProperty, binding);
cell.Content = comboBox;
break;
default:
TextBox textBox = new TextBox();
textBox.Style = (Style)FindResource("TextBoxInError");
cell.Content = textBox;
binding.ValidationRules.Add(new DevLinkValidationRule(link));
textBox.SetBinding(TextBox.TextProperty, binding);
break;
}
}
}