使用WPF XAML独立地对齐ListView列文本

时间:2015-09-08 00:26:59

标签: c# wpf xaml listview

我正在学习一些WPF控件,并且无法在listView列中单独对齐文本。我已经能够将它们全部对齐,并对齐标题,而不是列数据本身。我很感激一些帮助它的工作。

请注意,这与此问题类似:WPF Listview, align listview item horizontal dynamic not in xaml

我还在博客上尝试过其他一些解决方案。虽然这似乎已经得到了回答,但我无法将其付诸实践。我想要"文件名"列数据左对齐,其他两列居中对齐。所有中心的标题都很好。

作为一个附带问题,显示这样的数据的首选方法是什么?我引用的问题提到DataGrid更容易使用。

代码:

private void saveSortOrder(ArrayList<String> sortCols, ArrayList<String> sortDirs) {
    sortCols = new ArrayList<>();
    sortDirs = new ArrayList<>();

    for (TableColumn<MyType, ?> c : getSortOrder()) {
        sortCols.add(c.getText());
        sortDirs.add(c.getSortType().toString());
    }
}

private void applySortOrder(ArrayList<String> sortCols, ArrayList<String> sortDirs) {
    List<TableColumn<MyType, ?>> sortOrder = getSortOrder();
    sortOrder.clear();

    for (int ix = 0; ix < sortCols.length; ix++) {
        for (TableColumn<MyType, ?> c : unchangedColumns) {
            if (c.getText().equals(sortCols[ix])) {
                sortOrder.add(c);
                c.setSortType(TableColumn.SortType.valueOf(sortDirs[ix]));
            }
        }
    }
}

**编辑:** 修正了这样做:

参考几个地方,&#34; DisplayMemberBinding&#34;优先于其他任何事情。我只需要定义一个&#34; DataTemplate&#34;为每一列并绑定&#34; TextBlock.Text&#34;到正确的&#34;绑定路径&#34;。然后删除&#34; DisplayMemberBinding&#34;引用。

        <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>

1 个答案:

答案 0 :(得分:1)

很简单,您的标题会自动使用TextBlock,因为您没有指定容器,请在每个GridViewColumnHeader中指定它们,您可以随意使用它(哦)并且您需要删除DisplayMemberBinding,因为我们现在明确定义标题的内容),例如:

            <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>