2

最初の列に「ランキング」または「位置」の数値を保持する WPF DataGrid があります。私が望むのは、列をクリックしてその列に基づいてテーブルをソートし、最初の列をそのままにしておくことです。

例えば:

ポジション名 ゲーム ポイント PPG
1 ジョン 2 10 5
2 メアリー 3 12 4

ゲームで降順に並べ替えると、

ポジション名 ゲーム ポイント PPG
1 メアリー 3 12 4
2 ジョン 2 10 5

これを行う方法はありますか?DataColumn にはそのようなプロパティがないようで、FreezeColumnsCount はそれらを常にビューに保持するだけで、残りのデータと一緒に並べ替えられるのを止めません。

4

3 に答える 3

3

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/ffd7037d-dd77-44ec-9011-d0d43d5706aa/で、コメントで提案したことの例(Adbieからの回答)を見つけました:

<DataGrid LoadingRow="dg_LoadingRow">
    <DataGrid.RowHeaderTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=Header, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}}" />
        </DataTemplate>
    </DataGrid.RowHeaderTemplate>
</DataGrid>


private void dg_LoadingRow(object sender, DataGridRowEventArgs e)
{
    e.Row.Header = (e.Row.GetIndex() + 1).ToString();
}


OPによる編集:
バインディングがなくても機能することを確認しました。cs コードは問題ありませんが、XAML で行う必要があるのは

<DataGrid LoadingRow="dg_LoadingRow" />
于 2012-04-25T23:21:25.083 に答える
3

これには a を使用しValueConverterます。その方法を正確に説明することはできませんが、注目したいItemContainerGeneratorのは DataGrid のプロパティです。

DataGridValueConverter にプロパティを追加して、Convert メソッドからアクセスできるようにします。ContainerFromItemここで、convert では、呼び出して UI オブジェクトを取得し、次にIndexFromContainer行のインデックスを取得する必要があります。いくつかの問題が発生すると確信していますが、これで始められるはずです。

これの良いところは、独自のソートを行う必要がないことです。SortDescriptionsこれは、DataGrid によって使用されるに追加されるICollectionView(バインドしない場合は、自動的に作成される)に依存します。

編集

要求されたコード例は次のとおりです。自分でこれを行う必要はありませんでしたが、ここから始めます。

変換された提案された値は次のようになります

public ItemPositionValueConverter : IValueConverter
{
    public DataGrid DataGrid { get; set; }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
        {
            return null;
        }

        if (DataGrid == null)
        {
            return null;
        }

        ItemContainerGenerator generator = DataGrid.ItemContainerGenerator;
        return generator.IndexFromContainer(generator.ContainerFromItem(value));
    }

    //you probably don't need ConvertBack put it is provided for completeness
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        int? index = value as int?

        if (index == null)
        {
            return null
        }

        if (DataGrid == null)
        {
            return null;
        }

        ItemContainerGenerator generator = DataGrid.ItemContainerGenerator;
        return generator.ItemFromContainer(generator.ContainerFromIndex(index.Value));
    }
}

これを使用するには、次のようにします。

<UserControl>
    <UserControl.Resources>
        <ItemPositionValueConverter x:Key=ItemPositionValueConverter"
                                    DataGrid="{Binding ElementName=MyDataGrid}" />
    </UserControl.Resources>

    <DataGrid x:Name="MyDataGrid" ItemsSource="{Binding ....}">
        <DataGrid.Columns> 
            <DataGridTextColumn Header="Position"
                                Binding="{Binding Converter={StaticResource ItemPositionValueConverter}}"/>
        </DataGrid.Columns>
</UserControl>

このソリューションでは、並べ替えを ICollectionView に手動で追加する必要はありません。列ヘッダーをクリックすると、並べ替えが自動的に適用されます。

**免責事項: このコードはテストされておらず、説明どおりに機能しない可能性があります。必要なロジックを示すのは、ここではプロバイダーです。そのため、タイプミスやバグが含まれている可能性があります。このコードを使用しようとする人は、独自のテストを実行して、ニーズに合っていることを確認する必要があります。

于 2012-04-25T18:56:36.657 に答える
0

新しい答え:

だから私の最後の答えは明らかに標準に達していませんでした、私はいくつかの研究をしました、そしてあなたがこのようにあなたが探していることをすることができるようです:

 Dim view As ICollectionView = CollectionViewSource.GetDefaultView(ListViewName.Items)
 view.SortDescriptions.Add(New SortDescription("Field To Sort By", 0))

どこ

  • 「並べ替えるフィールド」は列名です
  • #は方向0が昇順、1が降順です

ノート:

  • リスト内の同じ列のソート順を変更する間に、view.SortDescriptions.Clear()を呼び出す必要があります
于 2012-04-25T20:15:55.653 に答える