2012-05-01 11 views
3

私はを構成するComboBoxを持っていて、そのIsEnabledプロパティをテンプレートDataGridTemplateColumnIsReadOnlyプロパティにバインドする際に問題があります。DataTemplate内に適用されたスタイルを使用してDataGridTemplateColumnにバインドしますか?

私はVSの出力ウィンドウに次のエラーを受けてきました:

'オブジェクト' '' のContentPresenter」

ComboBoxのスタイルには見られない'IsReadOnlyの' プロパティ:

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

この問題は、私のDataGridColumnを特定することを目的としたRelativeSource私が試した:

  • RelativeSource={RelativeSource TemplatedParent}

  • RelativeSource AncestorType={x:Type DataGridColumn}

  • RelativeSource AncestorType={x:Type DataGridTemplateColumn}

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

P.S.

私はそのテンプレート列の親DataGridのプロパティにDataTemplate内の別のComboBoxをバインドするために、この同じ技術を使用しました。 違いはここで私はコンバータを使用しており、グリッドの代わりにという列のプロパティにバインドしようとしています。しかし、上記のスタイルからコンバーターを削除しても、バインドは行われません。

+1

そのような列にはバインドできません。論理的または視覚的なツリー内のオブジェクトではなく、単にデータであるため、RelativeSourceは失敗します。 [バインディングをデバッグする]必要があります(http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/30/debugging-data-bindings-in-a-wpf-or-silverlight-application.aspx)確かにバインディングエラーが発生します。 –

+0

@ H.B。それは素晴らしい記事です、頭の中でハンクス!私の出力ウィンドウに見つかったバインディングエラーが問題にあります...あなたの回避策や代替方法がわかっている場合は、回答を投稿してください。 – Rob

+1

これはTemplatedParentのエラーです。列へのバインディングでは、ソースが見つからないことを確認する必要があります。とにかく、通常は '' x:Reference'(http://msdn.microsoft.com/en-us/library/ee795380.aspx)と組み合わせて 'Binding.Source'を使用してDG列にのみバインドすることができます。周期的な依存関係に複雑になる。有益な答えは –

答えて

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から値を拾う必要があります。

1

この列をリソースとして作成すると、StaticResourceをターゲットとして使用できる可能性があります。例えば列の名前を経由してコメントBinding.Sourcex:Referenceで述べたように

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

は、構造に応じて、同様に動作することがあります。リファレンスを持つパーツを参照されている要素のリソースに移動することができれば、通常、循環的な依存エラーを取り除くことができます。あなたはその部分が必要な場所でStaticResourceの拡張子を使用するだけで、あまり便利ではありません。

+0

+1です。コメントに記載されているように受け入れてくれて申し訳ありませんが、Stipoは簡潔な回答を提供しましたが、このアプローチではXAMLを再構築する必要がありました。おそらくこれを将来的に使うだろうか:) – Rob

+0

@robjb:それは私が言わなければならないかなり興味深い考えです。 –

関連する問題