【问题标题】:Binding to elements in WPF GridViewHeader doesn't work绑定到 WPF GridViewHeader 中的元素不起作用
【发布时间】:2021-08-16 18:02:50
【问题描述】:

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

我在 UserControl 的代码隐藏中创建了 DependencyProperties,并将 Xaml 数据上下文绑定到自身(名称=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>

【问题讨论】:

    标签: wpf gridview binding dependency-properties


    【解决方案1】:

    如果你定义了一个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>
    

    在与标题相同的命名范围内没有名为“root”的元素,但您应该能够使用RelativeSource 属性绑定到可视树中的父元素。

    这假定父 UserControl 具有 CarModelFilter 属性。

    【讨论】:

    • 父级是正确的 UserControl 并且它确实具有 CarModelFilter 属性..但您的建议不起作用 - 绑定找不到 CarModelFilter 属性。也许它找不到祖先?
    • 您需要输入DataTemplate。请参阅我的编辑。您可能还必须将 Header 属性设置为 null 以外的其他值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2018-02-20
    • 2013-07-03
    • 2015-01-08
    • 1970-01-01
    • 2011-10-02
    相关资源
    最近更新 更多