0

ICollectionView並べ替えとフィルタリングを有効にする必要がある状況を処理するために、WPFが導入されたのを見ました。アイテムを分類する記事もほとんど見ませんでしたが、私の主な関心事は、なぜ私のアプローチが失敗するのかということです。私のコードを見てみましょう:

 <ListView ItemsSource="{Binding}" x:Name="lvItems" GridViewColumnHeader.Click="ListView_Click">
            <ListView.View>
                <GridView AllowsColumnReorder="True">
                    <GridViewColumn Header="Id" DisplayMemberBinding="{Binding Id}" />
                    <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" />
                    <GridViewColumn Header="Developer">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Path=Developer}" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="Salary">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Path=Salary}" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>

                </GridView>
            </ListView.View>
        </ListView>

コードビハインドでは、アイテムがクリックされたとき、私は次のようにしています:

  ICollectionView Source { get; set; }


        private void ListView_Click(object sender, RoutedEventArgs e)
        {
            GridViewColumnHeader currentHeader = e.OriginalSource as GridViewColumnHeader;
            if(currentHeader != null && currentHeader.Role != GridViewColumnHeaderRole.Padding)
            {
                //using (this.Source.DeferRefresh())
                //{
                    SortDescription currentPropertySort = this.Source.SortDescriptions.FirstOrDefault<SortDescription>(item => item.PropertyName.Equals(currentHeader.Column.Header.ToString()));
                    if (currentPropertySort != null)
                    {
                        if (currentPropertySort.Direction == ListSortDirection.Ascending)
                            currentPropertySort.Direction = ListSortDirection.Descending;
                        else
                            currentPropertySort.Direction = ListSortDirection.Ascending;

                    }
                    else
                        this.Source.SortDescriptions.Add(new SortDescription(currentHeader.Column.Header.ToString(), ListSortDirection.Ascending));


                //}
                    this.Source.Refresh();
                    this.lvItems.DataContext = this.Source;
                    this.lvItems.UpdateLayout();
            }


        }

したがって、のヘッダーListBoxがクリックされるたびに、アイテムを並べ替える必要があります。Sourceというプロパティを使用してコレクションを保持し、を呼び出してコレクションを使用していlvItems.DataContext = this.Source.ますが、コードが機能していないようです。

4

1 に答える 1

3

これは、ListView_Clickメソッドの更新バージョンであり、ある程度機能します。探している並べ替え動作が正確にはわかりませんが、以下のバージョンでは、並べ替えの説明のセットが「積み上げ」られ、最後にクリックされた列が「プライマリの並べ替えの説明」になります。これが理にかなっていることを願っています。以下のコードがお役に立てば幸いです。=)

private void ListView_Click(object sender, RoutedEventArgs e)
{
    GridViewColumnHeader currentHeader = e.OriginalSource as GridViewColumnHeader;
    if(currentHeader != null && currentHeader.Role != GridViewColumnHeaderRole.Padding)
    {
        if (this.Source.SortDescriptions
            .Count((item) => item.PropertyName.Equals(currentHeader.Column.Header.ToString())) > 0)                
        {
            SortDescription currentPropertySort = this.Source
                .SortDescriptions
                .First<SortDescription>(item => item.PropertyName.Equals(currentHeader.Column.Header.ToString()));

            //Toggle sort direction.
            ListSortDirection direction = 
                (currentPropertySort.Direction == ListSortDirection.Ascending)?
                ListSortDirection.Descending : ListSortDirection.Ascending;

            //Remove existing sort
            this.Source.SortDescriptions.Remove(currentPropertySort);
            this.Source.SortDescriptions.Insert(0, new SortDescription(currentHeader.Column.Header.ToString(), direction));
        }
        else
        {
            this.Source.SortDescriptions.Insert(0, new SortDescription(currentHeader.Column.Header.ToString(), ListSortDirection.Ascending));
        }

        this.Source.Refresh();
    }
}

編集:

ちなみに、上記のコードの問題の1つは、既存のSortDescriptionをクエリするための「FirstOrDefault」の呼び出しです。SortDescriptionは構造体であり、null許容ではないため、FirstOrDefaultの呼び出しがnullになることはなく、常にインスタンスが返されます。したがって、上記のコードの「else-statement」が呼び出されることはありません。

于 2010-08-23T20:48:17.680 に答える