WPF - 样式 - 在GridView标题中绑定到自身属性

时间:2018-01-01 19:52:22

标签: c# wpf listview gridview width

我认为这是一项简单的任务,但我无法弄清楚如何做到这一点,也没有找到解决方案。我有一个简单的wpf应用程序,我有一个带有gridview视图的列表视图。我正在对columnheader进行简单的重新设计:

    <ListView Margin="5" ItemsSource="{Binding Path=Reservations}" Name="MainListView">
        <ListView.Resources>
            <Style TargetType="GridViewColumnHeader">
                <Setter Property="HorizontalContentAlignment" Value="Left" />
                <Setter Property="ContentTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <TextBlock Text="{Binding}" Padding="5,0" />
                        </DataTemplate>
                    </Setter.Value>
                </Setter>

                <Setter Property="MinWidth" Value="{Binding Path=Content.ActualWidth, RelativeSource={RelativeSource Self}}" />
            </Style>
        </ListView.Resources>

        <ListView.View>
            <GridView AllowsColumnReorder="True">
                <!-- Columns -->
            </GridView>
        </ListView.View>
    </ListView>

此样式将左侧的标题文本与左侧的4px缩进对齐。

现在我想要实现的是每个列的minwidth属性根据标题中textblock的ActualWidth属性设置。我试图使用样式

中的这段代码来实现这一点
<Setter Property="MinWidth" Value="{Binding Path=Content.ActualWidth, RelativeSource={RelativeSource Self}}" />

但正如预期的那样,它不起作用。如何以正确的方式进行绑定?

1 个答案:

答案 0 :(得分:-1)

TextBlock元素不是GridViewColumnHeader的祖先。因此,可能的方法是将Converter添加到绑定。

<Setter 
    Property="MinWidth" 
    Value="{Binding RelativeSource={RelativeSource Self}, Converter={x:Static local:MyGridViewColumnHeaderConverter}}" 
    />

在MyGridViewColumnHeaderConverter中,可以通过VisualTreeHelper查找子项并返回已创建的TextBlock的ActualWidth。