4

財産Fooは私の中にありますDataContext

ViewModel {
    Visibility Foo;
}


Fooしかし、内部 にアクセスする方法がわかりませんColumnFooこの場合、おそらく、オブジェクトにバインドされているものを探していると思いますDataGrid ItemsSource

<DataGrid Visibility="{Binding Foo}">                      // works
    <DataGrid.Columns>
        <DataGridTextColumn Visibility="{Binding Foo}" />   // fails


私が試してみました

Binding="{Binding DataContext.Foo}"

RelativeSourceタグ付き のものもたくさんあります。


また、GUI からバインドするプロパティを表示して選択する方法はありますか?

編集: 列自体は FrameworkElements ではないことが判明したため、DataGrid の祖先を見つけることができません。ただし、以下の回答の手法を使用して、Column の CellTemplate のプロパティを DataContext にバインドできます。

4

2 に答える 2

4

この記事から、ビジュアル ツリーの外部にバインドするためのいくつかのアプローチを見つけました: WPF の人工継承コンテキスト

私はまだ4番目のオプションを使用しています(彼の提案に関連しています)。それはかなりハックですが単純です。これには、WPF 設計者が気に入らず、設計時にエラー ログにエラーが記録されるという欠点があります。アンビエントに到達するために、マークアップ拡張機能DataContextを使用して、ビジュアル ツリーにある現在の XAML ファイル内の何かにバインドできます( msdnを参照)。これは、通常はビジュアル ツリーの外部にない . 参照先に他に何もない場合は、ダミーを使用します。x:ReferenceElementNameInheritanceContextFrameWorkElementUserControl

UserControl含まれているもの(またはWindowまたはなど)を参照しようとしましたPageが、これは循環参照の例外につながるため、誰かがより良い方法を示すまでダミー要素を使用します。

<FrameworkElement Name="dummyElement" />
<DataGrid>
    <DataGrid.Columns>
        <DataGridTextColumn 
           Visibility="{Binding Source={x:Reference dummyElement}, 
                                Path=DataContext.Foo}" 
        />
于 2013-11-20T22:31:01.743 に答える
4

これはうまくいくはずです:

<DataGridTextColumn Visibility="{Binding Path=DataContext.Foo, RelativeSource={RelativeSource AncestorType=DataGrid}}" />

現在のアイテムにバインドされている列については正しいです。そのため、を使用して DataGrid を取得し、そのプロパティにRelativeSourceアクセスする必要があります。FooDataContext

バインドするプロパティの選択に関しては、WPF デザイナーのプロパティ パネルと、Resharper などのビジュアル スタジオ アドオンが役立ちますが、最終的には単純なバインド以外ではそれほど優れた仕事をしないので、残っているものはあなた自身であり、何が起こっているのかについてのあなたの理解です。

于 2013-07-25T20:27:10.217 に答える