1. ホーム
  2. wpf

[解決済み] WPFでGridViewColumnのデータを自動サイズ調整し、右揃えにする方法は?

2023-03-25 02:39:17

質問

どうすればよいのでしょうか。

  • ID列のテキストを右寄せにする。
  • 各カラムを、最も長い可視データを持つセルのテキストの長さに応じて自動サイズにする?

以下はそのコードです。

<ListView Name="lstCustomers" ItemsSource="{Binding Path=Collection}">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="ID" DisplayMemberBinding="{Binding Id}" Width="40"/>
            <GridViewColumn Header="First Name" DisplayMemberBinding="{Binding FirstName}" Width="100" />
            <GridViewColumn Header="Last Name" DisplayMemberBinding="{Binding LastName}"/>
        </GridView>
    </ListView.View>
</ListView>

部分的な回答です。

Kjetilさんありがとうございます。GridViewColumn.CellTemplateはうまく機能し、Auto Widthももちろん機能しますが、ObservativeCollection "Collection"が列幅より長いデータで更新されると、列サイズは自ら更新しないのでデータの初期表示に対するソリューションに過ぎないのですね。

<ListView Name="lstCustomers" ItemsSource="{Binding Path=Collection}">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="ID" Width="Auto">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Id}" TextAlignment="Right" Width="40"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <GridViewColumn Header="First Name" DisplayMemberBinding="{Binding FirstName}" Width="Auto" />
            <GridViewColumn Header="Last Name" DisplayMemberBinding="{Binding LastName}" Width="Auto"/>
        </GridView>
    </ListView.View>
</ListView>

どのように解決するのですか?

各カラムをオートサイズにするには、GridViewColumnにWidth="Auto"を設定すればよいです。

ID列のテキストを右寄せにするには、TextBlockを使用してセルテンプレートを作成し、TextAlignmentを設定します。次に、ListViewItem.HorizontalContentAlignmentを設定し(ListViewItemにセッターを持つスタイルを使用)、セルテンプレートがGridViewCell全体を埋めるようにします。

もしかしたら、もっと簡単な解決策があるかもしれませんが、これでうまくいくはずです。

注意してください。 この解決策には HorizontalContentAlignment=Stretchの両方が必要です。 を Window.Resources に記述し TextAlignment=Right をCellTemplateに記述しています。

<Window x:Class="WpfApplication6.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.Resources>
    <Style TargetType="ListViewItem">
        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
    </Style>
</Window.Resources>
<Grid>
    <ListView Name="lstCustomers" ItemsSource="{Binding Path=Collection}">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="ID" Width="40">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Id}" TextAlignment="Right" />
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="First Name" DisplayMemberBinding="{Binding FirstName}" Width="Auto" />
                <GridViewColumn Header="Last Name" DisplayMemberBinding="{Binding LastName}" Width="Auto"/>
            </GridView>
        </ListView.View>
    </ListView>
</Grid>
</Window>