3

ユーザーコントロールのデータコンテキストをビューモデル オブジェクトにバインドしようとしています。不明な理由で、結果として Window.Resources 内に DataContext を設定すると、

System.Windows.Data エラー: 3: DataContext を提供する要素が見つかりません。BindingExpression:Path=AreaFilter; DataItem=null;

window.resources の外で同じ datacontext を設定すると完璧に機能します。コードで問題を解決する必要があります。

<Window>
<Window.Resources>
    <GridViewColumnCollection x:Key="eventColumns">
        <GridViewColumn DisplayMemberBinding="{Binding Path=Area}">
            <GridViewColumn.Header>
                <v:FilterV DataContext="{Binding AreaFilter}"/> <!--here is the problem-->
            </GridViewColumn.Header>
        </GridViewColumn>
    </GridViewColumnCollection>
</Window.Resources>
<Grid>
    <v:FilterV DataContext="{Binding AreaFilter}"/> <!-- here it works OK -->
    <GridViewHeaderRowPresenter Name="listHeader" Columns="{StaticResource eventColumns}"/>
</Grid>

FilterV は、テキストブロックのみを表示するために現在単純化した UserControl です。グリッド内では、AreaFilter.Name が問題なく表示されます。これら 2 つの状況で DataContext を設定するときの違いと、それを解決する方法は何ですか?

4

1 に答える 1

2

GridViewColumnは実際には の一部ではないため、バインディングを評価するときに使用する or ソースVisualTreeがないため、バインディングは機能しません。DataContext

DataContextあなたを参照するRelativeSourceバインディングで設定を試すことができますGridView

<GridViewColumn.HeaderTemplate>
    <DataTemplate>
        <v:FilterV DataContext="{Binding DataContext.AreaFilter, 
            RelativeSource={RelativeSource AncestorType={x:Type GridView}}}"/>
    </DataTemplate>
</GridViewColumn.HeaderTemplate>

それがうまくいかない場合、私が見つけた唯一の回避策は、探しているバインディングを含むFreezeableオブジェクトを作成し、静的リソースに設定することです.Resourcesv:FilterV.DataContext

<GridView.Resources>
    <local:BindingProxy x:Key="proxy" 
        Data="{Binding AreaFilter, ElementName=MyGridView}" />
</DataGrid.Resources>

...

<GridViewColumn.HeaderTemplate>
    <DataTemplate>
        <v:FilterV DataContext="{Binding Source={StaticResource proxy}}"/>
    </DataTemplate>
</GridViewColumn.HeaderTemplate>

この例をここで見ることができます

また、現在のようにプロパティに直接設定するのではなく、コントロールを含むにGridViewHeaderTemplateプロパティを設定する必要があります。をオブジェクトに直接設定すると、そのスタイルを使用するすべてのアイテムが 内の同じコントロールを使用しようとするため、そのプロパティを適用するオブジェクトが複数ある場合、アイテムは 1 つの親コントロールにのみ属することができるため、例外がスローされます。DataTemplate<v:FilterV />.ContentContentContentContent

于 2012-09-12T16:18:24.227 に答える