none
WPF Listview 特定の列だけにスタイルを適用したい RRS feed

  • 質問

  • WPFのListviewで、複数のColumnがある中で任意のColumnにだけスタイルを適用したいと思っています。

    me.Listview1というListviewに対して、どのようにVBでコーディングしたらよいのでしょうか。教えて下さい。

    適用するスタイルは次のようなものです。

       <Window.Resources>

                <Style x:Key="Style1" TargetType="{x:Type ListViewItem}">
                    <Style.Triggers>
                 <Setter Property="HorizontalContentAlignment" Value="Center" />
                    </Style.Triggers>
                </Style>  

       </Window.Resources>

    ↑ ここでTargetType="{x:Type ListViewItem}"となっていますが、x:Typeの後に何を記述したら良いかわからないので、この部分だけ適当に作りました。

    質問にはロクに答えないで、他人の言葉尻等をとらえて悪口や揚げ足取りの投稿をするのはやめて下さい。

    2011年12月10日 9:43

回答

  • ListViewItemも触らないと右寄せは実現できませんよ。

    <ListView ItemsSource="{Binding}">
    
        <!-- これ -->
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="HorizontalContentAlignment" Value="Stretch" />
            </Style>
        </ListView.ItemContainerStyle>
    
        <ListView.View>
            <GridView>
                <GridView.Columns>
                    <GridViewColumn Width="100">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock  TextAlignment="Right" 
                                            Text="{Binding}"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView.Columns>
            </GridView>
        </ListView.View>
    </ListView>
    



    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
    • 回答としてマーク 馋涎欲滴 2011年12月13日 13:09
    2011年12月12日 13:04

すべての返信

  • ListView 自体には Column という概念は存在しないので、担当は GridView/GridViewColumn の方です。

    DisplayMemberBinding を使ったときに表示される文字列に対して Style は適用できないようなので、CellTemplate を使うことになるでしょう。

    2011年12月10日 10:26
  • Hongliangさん、早速の回答ありがとうございます。

    GridViewColumnクラスのプロパティーにカギがあると私も睨んでいたのですが、

    ヘッダーは、GridViewColumn.HeaderContainerStyleを操作することでスタイルを変えることができるということまではわかりました。しかしColumnHeaderではなくColumnにはスタイルを変えるためのプロパティーが無いため、どうすればわからず悩んでいます。

    GridViewColumn.CellTemplateでユーザーテンプレートを適用してみたいと思い、

                    <DataTemplate x:Key="MyTemp1">
                     <TextBlock   FontSize="11" Foreground="#FFE52626"  HorizontalAlignment="Right"></TextBlock>
                    </DataTemplate>

            Dim template2 As DataTemplate
            template2 = CType(Me.ListView1.FindResource("MyTemp1"), System.Windows.DataTemplate)

    こうして、特定のGridViewColumnに対して(GridViewColumnのインスタンス).CellTemplate = template2としてみましたが、何も変わりませんでした。

    引き続き、御教授をお願い致します。

    2011年12月10日 12:01
  • 何も変わらないというか、それではその TextBlock には常に何も表示されないように思うのですが。TextBlock.Text に対して Binding を付けるなりしないと。
    2011年12月10日 12:25
  • Listviewのdatasourceは正常に設定されています。すべてのColumnに対しても適切なバインディングがされており、Listviewの表示自体には問題はありません。特定のGridViewColumnに対して(GridViewColumnのインスタンス).CellTemplate = template2としているのですが、この行を削除してもListviewの表示に変化がないということです。

    ユーザーテンプレートを使用したり、スタイルを適用させるという私の方向性が誤っているかもしれません。

    単純に特定のColumnだけHolizontalAlignmentをCenter/Left/Rightのどれかに設定したいだけなのですが、WEBサイトから拾ってきた下の画像のように数値が左寄せになっているのを、右寄せで表示させたいのです。何か良い方法はありませんか?

     

    2011年12月11日 14:04
  • 単純に右寄せにしたいだけであれば、以下のようにすれば実現できます。

    <ListView ・・・・
        <ListView.View>
            <GridView>
                <GridView.Columns>
                    <GridViewColumn Header="金額">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Path=金額, StringFormat=N0}" HorizontalAlignment="Right" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                        ・
                        ・
                        ・


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2011年12月11日 14:30
    モデレータ
  • trapemiyasさん、御回答ありがとうございます。 
    御回答のXAMLソースでやっていることをVBに書き直してみましたが、表示は右寄せされません。
    XAML中の TextBlock Text="{Binding Path=cl0}" の{}内は、どうやって記述したらよいのかわからないので適当に書いています。
    それよりも、VBのソースコード中、
            gvc.CellTemplate = template2
    この行を有効にしても右寄せされません。
    なぜでしょうか。 
    ** XAML: 右寄せ用のテンプレートを含む
    <ListView Height="120" Name="ListView1" Width="423" VerticalAlignment="Top"   >
       
                <ListView.Resources>
                    <DataTemplate x:Key="MyTemp2">
                        <TextBlock Text="{Binding Path=cl0}" HorizontalAlignment="Right" />
                    </DataTemplate>
                </ListView.Resources>

    </ListView>

    ** VB:
        private sub sample1()

            Dim lv1 As ListView = Me.ListView1
            Dim gvc As GridViewColumn

            Dim myGridView As New GridView()

            Dim template2 As DataTemplate
            template2 = CType(lv1.FindResource("MyTemp2"), System.Windows.DataTemplate)

            myGridView.Columns.Clear()

            gvc = New GridViewColumn()
            gvc.Header = "cl0"
            gvc.Width = 120

        ’この下の行を有効にしても、右寄せされない
            gvc.CellTemplate = template2

            gvc.DisplayMemberBinding = New Binding("cl0")
            myGridView.Columns.Add(gvc)

            Me.ListView1.View = myGridView

            lv1.Items.Clear()
            lv1.ItemsSource = New LVsource()

        end sub

        ' Itemsource class
        Public Class LVsource
            Inherits ObservableCollection(Of Str0)

            Public Sub New()
                Add(New Str0("e", "76"))
                Add(New Str0("a", "1"))
            End Sub

        End Class

       Public Structure Str0

            Public Sub New(p0 As String, p1 As String)
                Me.cl0 = p0
                Me.cl1 = p1
            End Sub

            Public Property cl0 As String
            Public Property cl1 As String

        End Structure
    2011年12月12日 12:39
  • ListViewItemも触らないと右寄せは実現できませんよ。

    <ListView ItemsSource="{Binding}">
    
        <!-- これ -->
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="HorizontalContentAlignment" Value="Stretch" />
            </Style>
        </ListView.ItemContainerStyle>
    
        <ListView.View>
            <GridView>
                <GridView.Columns>
                    <GridViewColumn Width="100">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock  TextAlignment="Right" 
                                            Text="{Binding}"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView.Columns>
            </GridView>
        </ListView.View>
    </ListView>
    



    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
    • 回答としてマーク 馋涎欲滴 2011年12月13日 13:09
    2011年12月12日 13:04
  • ListViewItemも触らないと右寄せは実現できませんよ。

    ホントですね。私もリソースにおいてStyleで指定していました。フォローありがとうございます。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2011年12月13日 2:26
    モデレータ
  •  ListViewItemにスタイルを適用しないと、テンプレートに記述したTextBlockのTextAlignmentが変わらないのですね。実験してわかりました。

    VBの記述方法で悩んでいるうちに、テンプレートをFrameworkElementFactoryクラスを利用してVBで記述するという方法を探し出しました。

            Dim t1 As New DataTemplate()
            Dim tbfactory1 As FrameworkElementFactory = New FrameworkElementFactory(GetType(TextBlock))

            tbfactory1.SetBinding(TextBlock.TextProperty, New Binding("c0"))

            tbfactory1.SetValue(TextBlock.TextAlignmentProperty, TextAlignment.Right)
            t1.VisualTree = tbfactory1

    こうして、 (GridViewColumnのインスタンス).CellTemplate = t1とした。

     

    ListviewのColumnの書式やバインドをダイナミックに切り替えるというロジックを組んでいるので、XAMLによる固定記述ではどうやっても表現できません。これで、思い通りのロジックを組めるようになりました。

    皆さんどうもありがとうございました。


    2011年12月13日 13:08