3

ComboBox構成する があり、そのプロパティをテンプレート化された のプロパティにDataTemplateバインドするのに問題があります。IsEnabledIsReadOnlyDataGridTemplateColumn

VS 出力ウィンドウに次のエラーが表示されます。

「IsReadOnly」プロパティが「オブジェクト」「ContentPresenter」に見つかりません

コンボボックスのスタイル:

<Style TargetType="{x:Type ComboBox}" x:Key="ProficiencyColumnComboBoxStyle">
    <Setter Property="IsEnabled" 
        Value="{Binding RelativeSource={RelativeSource Mode=TemplatedParent},
        Path=IsReadOnly, Converter={StaticResource BooleanOppositeConverter}}" />
</Style>

問題は、RelativeSource自分のDataGridColumn. 私はもう試した:

  • RelativeSource={RelativeSource TemplatedParent}

  • RelativeSource AncestorType={x:Type DataGridColumn}

  • RelativeSource AncestorType={x:Type DataGridTemplateColumn}

このスタイルに他のセッターを追加しようとしましたが、それらは効果があるので、スタイルを知っておりDataTemplate、コントロールに適用されています。

PS

これと同じ手法を使用して、テンプレート化された列の親のプロパティにComboBox内の別のプロパティをバインドしました。違いは、ここではコンバーターを使用しており、(グリッドではなく) 列のプロパティにバインドしようとしていることです。ただし、上記のスタイルからコンバーターを削除しても、バインディングは行われません。DataTemplateDataGrid

4

2 に答える 2

3

これを試して:

<Style TargetType="{x:Type ComboBox}" x:Key="ProficiencyColumnComboBoxStyle">
    <Setter Property="IsEnabled" 
            Value="{Binding IsReadOnly, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridCell}}, Converter={StaticResource BooleanOppositeConverter}}"/>
</Style>

DataGridCell.IsReadOnly は、その DataGridColumn.IsReadOnly から値を取得する必要があります。

于 2012-05-01T19:51:53.160 に答える
1

StaticResource列をリソースとして作成すると、それをターゲットにするために使用できるようになる可能性があります。例えば

<DataGrid.Resources>
    <DataGridTemplateColumn x:Key="Column" .../>
</DataGrid.Resources>
<DataGrid.Columns>
    <StaticResource ResourceKey="Column"/>
</DataGrid.Columns>
{Binding IsReadOnly, Source={StaticResource Column}}

コメントBinding.Sourceで述べたようx:Referenceに、構造によっては、列の名前でも機能する場合があります。参照のある部分を参照されている要素のリソースに移動できる場合、通常は循環依存エラーを取り除くことができます。StaticResourceその部分が必要な場所で拡張機能を使用するだけでよく、あまり便利ではありません。

于 2012-05-01T19:16:38.420 に答える