简体   繁体   中英

Align ListView Column Text independently with WPF XAML

I'm learning some WPF controls and am having trouble individually aligning the text in listView columns. I've been able to align them all together, and align the headers, just not the column data itself. I would appreciate some help getting it working.

As a note, this is similar to this question: WPF Listview, align listview item horizontal dynamic not in xaml

I've also tried some other solutions on blogs. While this seems to have been answered, I just can't get it too work. I'd like for the "Filename" column data to be left aligned, and the other two columns center aligned. The headers are fine all centered.

As a side question, what is the preferred method for displaying data like this? The question I referenced alluded to the DataGrid as being easier to work with.

Code:

        <ListView x:Name="edtListView" Margin="30,68,30,52" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
        <ListView.ItemContainerStyle>
            <Style TargetType="{x:Type ListViewItem}">
                <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
                <EventSetter Event="MouseDoubleClick" Handler="HandleRow_DoubleClick" />
            </Style>
        </ListView.ItemContainerStyle>
        <ListView.View>
            <GridView>
                <GridView.ColumnHeaderContainerStyle>
                    <Style TargetType="{x:Type GridViewColumnHeader}">
                        <EventSetter Event="Click" Handler="SortHeader_Click"/>                            
                    </Style>
                </GridView.ColumnHeaderContainerStyle>
                <GridViewColumn x:Name="fileNameColumn" DisplayMemberBinding="{Binding Path}" Width="450" TextBlock.TextAlignment="Left" >
                    <GridViewColumn.Header>
                        <GridViewColumnHeader Content="Filename" Tag="Path"/>
                    </GridViewColumn.Header>
                </GridViewColumn>
                <GridViewColumn DisplayMemberBinding="{Binding MissedEdts}" Width="50" TextBlock.TextAlignment="Center" >
                    <GridViewColumn.Header>
                        <GridViewColumnHeader Content="Missed" Tag="MissedEdts"/>
                    </GridViewColumn.Header>
                </GridViewColumn>
                <GridViewColumn DisplayMemberBinding="{Binding Notes}" Width="95" TextBlock.TextAlignment="Center" >
                    <GridViewColumn.Header>
                        <GridViewColumnHeader Content="Notes" Tag="Notes"/>
                    </GridViewColumn.Header>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>

**EDIT: ** Fixed it doing this:

As referenced a couple places, the "DisplayMemberBinding" takes precedence over anything else. I just needed to define a "DataTemplate" for each column and bind the "TextBlock.Text" to the correct "Binding Path". Then delete the "DisplayMemberBinding" references.

<Window.Resources>
    <Style TargetType="{x:Type GridViewColumnHeader}">
        <EventSetter Event="Click" Handler="SortHeader_Click"/>
    </Style>
    <Style TargetType="{x:Type ListViewItem}">
        <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
        <EventSetter Event="MouseDoubleClick" Handler="HandleRow_DoubleClick" />
    </Style>
    <DataTemplate x:Key="value1Template">
        <TextBlock TextAlignment="Left" Text="{Binding Path}"/>
    </DataTemplate>
    <DataTemplate x:Key="value2Template">
        <TextBlock TextAlignment="Center" Text="{Binding MissedEdts}"/>
    </DataTemplate>
    <DataTemplate x:Key="value3Template">
        <TextBlock TextAlignment="Center" Text="{Binding Notes}"/>
    </DataTemplate>
</Window.Resources>



<ListView x:Name="edtListView" Margin="30,68,30,52" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
    <ListView.View>
        <GridView>
            <GridViewColumn x:Name="fileNameColumn" CellTemplate="{StaticResource value1Template}" Width="450" >
                <GridViewColumn.Header>
                    <GridViewColumnHeader Content="Filename" Tag="Path"/>
                </GridViewColumn.Header>
            </GridViewColumn>
            <GridViewColumn  Width="50" CellTemplate="{StaticResource value2Template}">
                <GridViewColumn.Header>
                    <GridViewColumnHeader Content="Missed" Tag="MissedEdts"/>
                </GridViewColumn.Header>
            </GridViewColumn>
            <GridViewColumn CellTemplate="{StaticResource value3Template}" Width="95" >
                <GridViewColumn.Header>
                    <GridViewColumnHeader Content="Notes" Tag="Notes"/>
                </GridViewColumn.Header>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

Easy, your headers automatically use TextBlock 's since you didn't specify the container, specify them in each GridViewColumnHeader and you can do what you want with it (oh and you will need to remove your DisplayMemberBinding since we are explicitly defining the content of the header now), eg:

            <GridViewColumn x:Name="fileNameColumn" Width="450" TextBlock.TextAlignment="Left" >
                <GridViewColumn.Header>
                    <GridViewColumnHeader Content="Filename" Tag="Path">
                        <TextBlock Text="{Binding Path}" HorizontalTextAlignment="Right" FontSize="100"/> <!--This line-->
                    </GridViewColumnHeader>
                </GridViewColumn.Header>
            </GridViewColumn>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM