View -> ViewModel 解決のために Cinch (したがって MefedMVVM) を利用する、標準の MVVM パターンを持つ WPF アプリケーションがあります。これはうまく機能し、関連するコントロールを ViewModel のプロパティにバインドできます。
特定のビュー内に、Infragistics XamGrid があります。このグリッドは、ViewModel の ObservableCollection にバインドされ、適切な行を表示します。ただし、このグリッドには、ObservableCollection ではなく、親 DataContext のプロパティに TextBox テキスト値をバインドしようとしている特定の列があります。このバインディングは失敗しています。
ここでは、次のようないくつかのオプションを検討しました。
AncestorType を使用してツリーを追跡し、親 UserControl の DataContext にバインドします (この質問への優れた回答とこの質問から) ...
{Binding Path=PathToProperty, RelativeSource={RelativeSource AncestorType={x:Type typeOfAncestor}}}
ElementName を指定し、最上位のコントロールを直接ターゲットにしようとしています。ElementName の使用について読みたい場合は、こちらをご覧ください。
UserControl のリソースで定義された「プロキシ」FrameorkElement を使用して、必要に応じてコンテキストを「渡します」。以下のように要素を定義し、静的リソースとして参照します...
<FrameworkElement x:Key="ProxyContext" DataContext="{Binding Path=DataContext, RelativeSource={RelativeSource Self}}"></FrameworkElement>
この場合、バインディングは FrameworkElement を見つけますが、それを超えるものにはアクセスできません (パスを指定する場合)。
いろいろ読んだところ、これは Infragistics XamGrid がツリーの外側に列を構築していることが原因である可能性が非常に高いようです。ただし、その場合でも、少なくともオプション 2 または 3 は機能するはずです。
私たちの最後の考えでは、これは V - VM バインディングに関連しているということですが、Snoop を使用しても、正確な問題が何であるかはまだわかっていません。私は決して WPF バインディングの専門家ではないので、ポインタをいただければ幸いです。
編集: Infragistics hereからいくつかのテンプレートの例を見つけたので、試してみます。
編集 2: @Dtex で指摘されているように、テンプレートが最適です。XamGrid で使用する関連スニペットは次のとおりです。
<ig:GroupColumn Key="CurrentDate">
<ig:GroupColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=DataContext.CurrentDateTest, RelativeSource={RelativeSource AncestorType=UserControl}}" />
</DataTemplate>
</ig:GroupColumn.HeaderTemplate>
<ig:GroupColumn.Columns>
XML を開いたままにしておきます...必要な列を追加してから、関連するタグを閉じます。