C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

C# WPF ListViewのカラムヘッダクリック

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■86293 / inTopicNo.1)  C# WPF ListViewのカラムヘッダクリック
  
□投稿者/ きみのぶ (32回)-(2018/01/14(Sun) 15:53:57)

分類:[.NET 全般] 

C# WPF ListViewのカラムヘッダクリックによるソートを実装しようとしているのですが、出来ません。

XAML)
<ListView Grid.Column="1" Name="listView_Checked" ItemsSource="{Binding Pictures, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  >
  <ListView.View>
    <GridView>
      <GridViewColumn Width="128">
        <GridViewColumnHeader Margin="0,0,2,0" />
          <GridViewColumn.CellTemplate>
            <DataTemplate>
              <StackPanel>
                <Image Source="{Binding Path}"/>
              </StackPanel>
            </DataTemplate>
          </GridViewColumn.CellTemplate>
        </GridViewColumn>

        <GridViewColumn Width="400" >
          <GridViewColumnHeader Margin="0,0,2,0" Tag="path" Click="CheckedGridViewColumnHeader_Click" />
            <GridViewColumn.CellTemplate>
              <DataTemplate>
                <StackPanel>
                  <TextBlock Text="{Binding Path}" Foreground="DarkBlue" TextWrapping="Wrap" Style="{StaticResource GlowingTextBlockStyle}" />
                </StackPanel>
              </DataTemplate>
            </GridViewColumn.CellTemplate>
          </GridViewColumn>

          <GridViewColumn Width="212" >
            <GridViewColumnHeader Margin="0,0,2,0" Tag="lastUpdate" Click="CheckedGridViewColumnHeader_Click" />
              <GridViewColumn.CellTemplate>
                <DataTemplate>
                  <StackPanel Width="190">
                    <TextBlock Text="{Binding LastUpdateText}" Foreground="DarkBlue" HorizontalAlignment="Center" Style="{StaticResource GlowingTextBlockStyle}" />
                  </StackPanel>
                </DataTemplate>
              </GridViewColumn.CellTemplate>
            </GridViewColumn>

            <GridViewColumn  Width="140" >
              <GridViewColumnHeader Margin="0,0,2,0" Tag="size" Click="CheckedGridViewColumnHeader_Click" />
                <GridViewColumn.CellTemplate>
                  <DataTemplate>
                    <StackPanel Width="128">
                      <TextBlock Text="{Binding SizeText}" Foreground="DarkBlue" HorizontalAlignment="Right" Style="{StaticResource GlowingTextBlockStyle}" />
                    </StackPanel>
                  </DataTemplate>
                <GridViewColumn.CellTemplate>
              </GridViewColumn>
            </GridView>
          </ListView.View>
        </ListView>

C#)

        private void CheckedGridViewColumnHeader_Click(object sender, RoutedEventArgs e)
        {
            GridViewColumnHeader columnHeader = sender as GridViewColumnHeader;
            this.SortListView(this.listView_Checked, columnHeader.Tag as String);
        }

        private void SelectedGridViewColumnHeader_Click(object sender, RoutedEventArgs e)
        {
            GridViewColumnHeader columnHeader = sender as GridViewColumnHeader;
            this.SortListView(this.listView_Selected, columnHeader.Tag as String);
        }

        private void SortListView(ListView listView, String tag)
        {
            if(listView.Items.Count < 2)
            {
                return;
            }

            ListSortDirection direction;
            SortDescription sortDescription;
            if (listView.Items.SortDescriptions.Count == 0)
            {
                direction = ListSortDirection.Descending;
                sortDescription = new SortDescription(tag, direction);
                listView.Items.SortDescriptions.Add(sortDescription);
                return;
            }

            if(listView.Items.SortDescriptions.Last().Direction == ListSortDirection.Ascending)
            {
                direction = ListSortDirection.Descending;
            }
            else
            {
                direction = ListSortDirection.Ascending;
            }

            listView.Items.SortDescriptions.Clear();
            sortDescription = new SortDescription(tag, direction);
            listView.Items.SortDescriptions.Add(sortDescription);
        }

上記コードでカラムヘッダをクリックすると、1回目のクリックではソートされるのですが、2回目以降のソートでは、何もソートされません。
何がいけないのか、ご教示お願い致します。

引用返信 編集キー/
■86297 / inTopicNo.2)  Re[1]: C# WPF ListViewのカラムヘッダクリック
□投稿者/ Hongliang (597回)-(2018/01/15(Mon) 10:38:41)
ごくシンプルなプロジェクトで、ItemsSourceをDataTable, クラス配列, IEnumerable<匿名クラス>へのバインディングにしてそれぞれ試しましたが問題ありませんでした(クリックのたびにソート順が切り替わってソートされる)。
とりあえず、SortListViewにブレークポイントをおいて挙動を観察してみてはどうでしょうか。
引用返信 編集キー/
■86298 / inTopicNo.3)  Re[2]: C# WPF ListViewのカラムヘッダクリック
□投稿者/ ぶなっぷ (159回)-(2018/01/15(Mon) 10:41:18)
こちらで確認したところ、
> <GridViewColumnHeader Margin="0,0,2,0" Tag="???"
と、
> <TextBlock Text="{Binding ???}"
の ??? の値を合わせれば、動作しましたよ。

引用返信 編集キー/
■86299 / inTopicNo.4)  Re[3]: C# WPF ListViewのカラムヘッダクリック
□投稿者/ Hongliang (598回)-(2018/01/15(Mon) 10:57:00)
>><GridViewColumnHeader Margin="0,0,2,0" Tag="???"
> と、
>><TextBlock Text="{Binding ???}"
> の ??? の値を合わせれば、動作しましたよ。

ああ、当然の前提と思ってそこを見落としていましたね…。
引用返信 編集キー/
■86300 / inTopicNo.5)  Re[3]: C# WPF ListViewのカラムヘッダクリック
□投稿者/ きみのぶ (34回)-(2018/01/15(Mon) 11:21:35)
No86298 (ぶなっぷ さん) に返信
> こちらで確認したところ、
>><GridViewColumnHeader Margin="0,0,2,0" Tag="???"
> と、
>><TextBlock Text="{Binding ???}"
> の ??? の値を合わせれば、動作しましたよ。
>

ぶなっぷ 様
???の値を合わせる事で、昇順・降順の交互にソート出来ました。
tag名とBinding名を合わせるのは、当たり前の事なんですね。確かに、一致させなければ、ソートするデータの取得先が分からないですよね。
どうもありがとうございました。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ