1

したがって、私の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;
4

1 に答える 1

1

このIsReadOnlyプロパティは、ユーザーがコントロールの基になるテキストを変更できるようにする/禁止するためにコントロールに使用されますが、ComboBoxには、デフォルトで変更する基になるテキストがありません。MSDNIsHitTestVisibleからUIElementのプロパティを使用する必要がありました->この要素がレンダリングされたコンテンツの一部からヒットテスト結果として返される可能性があるかどうかを宣言する値を取得または設定します。

  <Setter Property="IsHitTestVisible" Value="False" />
于 2012-10-23T18:04:39.097 に答える