したがって、私のDataGridには、以下のスタイル、設定、読み取り専用のバインド、およびMultiDataTriggerを使用してトリガーされる変数の並べ替えがあります。グレー表示され、値が読み取り専用に設定されるため、機能することがわかります。唯一の問題は、DataGridTemplateColumnで作成されたComboBoxの場合、IsReadOnly値が設定されていないことです。どうすればこれを機能させることができますか?テンプレート列をどのようにバインドするかを見つける方法がわかりません。
<DataGrid></DataGrid>
DataGridスタイル(タグでラップされています)
<DataGrid.Style>
<Style TargetType="{x:Type DataGrid}">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding ReadOnly}" Value="True"/>
<Condition Binding="{Binding Reordering}" Value="False"/>
</MultiDataTrigger.Conditions>
<MultiDataTrigger.Setters>
<Setter Property="IsReadOnly" Value="True" />
<Setter Property="Foreground" Value="Gray" />
</MultiDataTrigger.Setters>
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding ReadOnly}" Value="True"/>
<Condition Binding="{Binding Reordering}" Value="True"/>
</MultiDataTrigger.Conditions>
<MultiDataTrigger.Setters>
<Setter Property="IsReadOnly" Value="True" />
</MultiDataTrigger.Setters>
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding ReadOnly}" Value="False"/>
</MultiDataTrigger.Conditions>
<MultiDataTrigger.Setters>
<Setter Property="IsReadOnly" Value="False" />
</MultiDataTrigger.Setters>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</DataGrid.Style>
DataGridTemplateColumnを作成するためのコード
DataTemplate comboDisplayTemplate = new DataTemplate();
FrameworkElementFactory comboDisplayElement = new FrameworkElementFactory(typeof(ComboBox));
Binding comboDisplayBinding = new Binding(f.ColumnName) { UpdateSourceTrigger = UpdateSourceTrigger.LostFocus };
comboDisplayElement.SetBinding(ComboBox.SelectedValueProperty, comboDisplayBinding);
comboDisplayElement.SetValue(ComboBox.DisplayMemberPathProperty, "Value");
comboDisplayElement.SetValue(ComboBox.SelectedValuePathProperty, "Key");
Binding comboDisplayListBinding = new Binding(f.ColumnName + "List");
comboDisplayElement.SetValue(ComboBox.ItemsSourceProperty, comboDisplayListBinding);
comboDisplayTemplate.VisualTree = comboDisplayElement;
templateColumn.CellTemplate = comboDisplayTemplate;
DataGridTemplateColumn templateColumn = new DataGridTemplateColumn() {
Header = f.ShortDisplay,
};
DataTemplate comboboxTemplate = new DataTemplate();
FrameworkElementFactory comboboxElement = new FrameworkElementFactory(typeof(ComboBox));
Binding comboboxBinding = new Binding(f.ColumnName) { UpdateSourceTrigger = UpdateSourceTrigger.LostFocus };
comboboxElement.SetBinding(ComboBox.SelectedValueProperty, comboboxBinding);
comboboxElement.SetValue(ComboBox.DisplayMemberPathProperty, "Value");
comboboxElement.SetValue(ComboBox.SelectedValuePathProperty, "Key");
Binding comboboxListBinding = new Binding(f.ColumnName + "List");
comboboxElement.SetValue(ComboBox.ItemsSourceProperty, comboboxListBinding);
comboboxTemplate.VisualTree = comboboxElement;
templateColumn.CellEditingTemplate = comboboxTemplate;