私は持っていDataGrid
ます。
内部にはいくつかの列が含まれています。2 はこの質問に関連しています。1 つはVariable 型を示すDataGridTextColumn
( ) で、もう 1 つは内部の TextBox または ComboBox である可能性がある( ) です。x:Name="varTypeColumn"
DataGridTemplateColumn
x:Name="varValueColumn"
varTypeColumn
が Bool 型の場合、 、の2 つの項目を含むvarValueColumn
を表示する必要があります。Type の場合、ユーザーが文字列を入力できる TextBox を表示する必要があります。ComboBox
True
False
varTypeColumn
Int
varValueColumn
だから私の質問は、でそれを行うことは可能xaml
ですか? コードでそれを行ういくつかの実装を見つけました。それは.cs
行を取得してセルを取得しようとし、最後に TextBox/ComboBox インスタンスをセルの 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;
}
}
}