3

我正在尝试将我的用户控件数据上下文绑定到 viewmodel 对象。由于未知原因,在 Window.Resources 中设置 DataContext 结果给出

System.Windows.Data 错误:3:找不到提供 DataContext 的元素。绑定表达式:路径=区域过滤器;数据项=空;

在 window.resources 之外设置相同的数据上下文非常完美。一段代码应该可以解决问题:

<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。在 Grid 内,它显示 AreaFilter.Name 没有问题。在这两种情况下设置DataContext有什么区别以及如何解决?

4

1 回答 1

2

我相信GridViewColumn它实际上不是 的一部分VisualTree,因此其中的绑定将不起作用,因为DataContext在评估绑定时它没有要使用的或源。

您可以尝试使用引用您DataContext的绑定设置RelativeSourceGridView

<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属性设置为DataTemplate包含您的控件的属性,而不是像现在<v:FilterV />这样直接在属性中设置它。.ContentContent直接设置为对象意味着使用该样式的任何项目都将尝试使用 中的相同控件Content,因此如果您有多个应用该Content属性的对象,它将引发异常,因为项目只能属于一个父控件

于 2012-09-12T16:18:24.227 回答