如何在 GridViewColumn 中绑定文本对齐方式

How to bind text alignment in GridViewColumn

我在 WPF 应用程序中使用 MVVM。我有一个 UserControl,其 DataContext 设置为 ViewModel。 UserControl 是一个有 3 列的 table。

下面是ListView/GridView:

<DockPanel>
        <ListView DockPanel.Dock="Top" ItemsSource="{Binding Items}" ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                  ctrl:ListViewLayoutManager.Enabled="True">
            <ListView.View>
                <GridView>

                    <GridViewColumn Header="{Binding ColumnHeader1}" 
                                    CellTemplate="{StaticResource cellTemplateColumn1}">
                        <GridViewColumn.HeaderContainerStyle>
                            <Style BasedOn="{StaticResource {x:Type GridViewColumnHeader}}" TargetType="GridViewColumnHeader">
                                <Setter Property="TextBlock.TextAlignment" Value="{Binding Column1HAlignment}" />
                            </Style>
                        </GridViewColumn.HeaderContainerStyle>
                    </GridViewColumn>

                    <GridViewColumn Header="{Binding ColumnHeader2}" 
                                    CellTemplate="{StaticResource cellTemplateColumn2}">
                        <GridViewColumn.HeaderContainerStyle>
                            <Style BasedOn="{StaticResource {x:Type GridViewColumnHeader}}" TargetType="GridViewColumnHeader">
                                <Setter Property="TextBlock.TextAlignment" Value="{Binding Column2HAlignment}" />
                            </Style>
                        </GridViewColumn.HeaderContainerStyle>
                    </GridViewColumn>

                    <GridViewColumn Header="{Binding ColumnHeader3}" 
                                    CellTemplate="{StaticResource cellTemplateColumn3}"
                                    ctrl:RangeColumn.IsFillColumn="True">
                        <GridViewColumn.HeaderContainerStyle>
                            <Style BasedOn="{StaticResource {x:Type GridViewColumnHeader}}" TargetType="GridViewColumnHeader">
                                <Setter Property="TextBlock.TextAlignment" Value="{Binding Column3HAlignment}" />
                            </Style>
                        </GridViewColumn.HeaderContainerStyle>
                    </GridViewColumn>

                </GridView>
            </ListView.View>
        </ListView>

    </DockPanel>

这是通过以下资源实现的:

<Style TargetType="GridViewColumnHeader">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="GridViewColumnHeader">
                            <TextBlock Text="{TemplateBinding Content}" Margin="5" Width="{TemplateBinding Width}">
                        </TextBlock>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Setter Property="FontWeight" Value="Bold" />
            <Setter Property="FontSize" Value="14" />
        </Style>

        <Style TargetType="ListViewItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
            <Setter Property="VerticalAlignment" Value="Stretch" />
            <Setter Property="VerticalContentAlignment" Value="Center" />
        </Style>

        <DataTemplate x:Key="cellTemplateColumn1">
            <fa:ImageAwesome Icon="{Binding IconType}" Foreground="{Binding Status}" Width="10" />
        </DataTemplate>

        <DataTemplate x:Key="cellTemplateColumn2">
            <TextBlock Text="{Binding SerialNumber, StringFormat='0'}" />
        </DataTemplate>

        <DataTemplate x:Key="cellTemplateColumn3">
            <TextBlock Text="{Binding Action}" TextWrapping="Wrap" />
        </DataTemplate>

每列的文本对齐方式是通过视图模型设置的table。我可以轻松地为 headers:

<GridViewColumn.HeaderContainerStyle>
    <Style BasedOn="{StaticResource {x:Type GridViewColumnHeader}}" TargetType="GridViewColumnHeader">
        <Setter Property="TextBlock.TextAlignment" Value="{Binding Column1HAlignment}" />
    </Style>
</GridViewColumn.HeaderContainerStyle>

但是我如何传递相同的参数 (Column1HAlignment) 来对齐单元格的 TextBlock 内容?

注意上图中第二列的对齐方式(其中 header 是 #)。 header 通过数据绑定右对齐。我希望每个单元格内容具有相同的绑定。

您可以使用 {RelativeSource}CellTemplate 中元素的 HorizontalAlignment 属性 绑定到 Column1HAlignment 源 属性:

<DataTemplate x:Key="cellTemplateColumn2">
    <TextBlock Text="{Binding SerialNumber, StringFormat='0'}"
                               HorizontalAlignment="{Binding DataContext.Column1HAlignment, 
                                    RelativeSource={RelativeSource AncestorType=ListView}}"/>
</DataTemplate>