绑定到 WPF GridViewHeader 中的元素不起作用

Binding to elements in WPF GridViewHeader doesn't work

我正在尝试为 ListView/GridView 创建自定义 header,用户可以在其中使用文本输入轻松过滤项目:

我已经在 UserControl 的 code-behind 上创建了 DependencyProperties,并将 Xaml 数据上下文绑定到自身 (name=root)。我遇到问题的绑定是 Header 内的 TextBox - 它根本不起作用。如果我将 'ModelVariantId' 设置为“Whatever”,它不会显示,同样我在写入时也不会收到任何 PropertyChanged 事件..

我在互联网上找到了 - 一些 - 听起来相似的问题,但没有完全匹配的问题。

<ListView ItemsSource="{Binding ElementName=root, Path=CombinedCarModels}">
    <ListView.View>
        <GridView>
            <GridViewColumn Width="120" DisplayMemberBinding="{Binding ModelVariantId}">
                <GridViewColumn.Header>
                    <GridViewColumnHeader HorizontalContentAlignment="Stretch">
                        <StackPanel>
                            <Label>ModelVariantId</Label>
                            <TextBox Text="{Binding ElementName=root, 
                                Path=CarModelFilter.ModelVariantId, Mode=TwoWay}" />
                        </StackPanel>
                    </GridViewColumnHeader>
                </GridViewColumn.Header>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

如果您定义 HeaderTemplate,此绑定应该有效:

Text="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, 
    Path=CarModelFilter.ModelVariantId, Mode=TwoWay}"

XAML:

<GridViewColumn.HeaderTemplate>
    <DataTemplate>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>
            <Label Grid.Row="0" HorizontalAlignment="Stretch">ModelVariantId</Label>
            <TextBox Grid.Row="1" HorizontalAlignment="Stretch"
                                  Text="{Binding ElementName=root, Path=CarModelFilter.ModelVariantId, Mode=TwoWay}" />
        </Grid>
    </DataTemplate>
</GridViewColumn.HeaderTemplate>

在与 header 相同的命名范围内没有名为“root”的元素,但您应该能够使用 [=13] 绑定到可视化树中的 parent 元素=] 属性.

这假设 parent UserControl 有一个 CarModelFilter 属性。