0

RowViewModels のコレクションを表示する PagedCollectionView にバインドされている Silverlight データグリッドがあります。

各 RowVM には CellViewModels のコレクションがあり、datagrid 列は templatecolumns であり、コンテンツが Cell[0].Content、Cell[1].Content などにバインドされて動的に生成されます。これは、rowviewmodels がサービスから返されるためです。任意の数の列とさまざまなタイプのコンテンツを含めることができます。

これは問題なく機能しますが、データグリッドで列の並べ替えを有効にするときに問題が発生しました。DataGridColumns の SortMemberPath プロパティ (最終的には SortDescription.PropertyName になります) は、"Cells[1].Content" のようなインデックスを含む式では機能しないようです。

誰もこれを回避する方法を知っていますか?

4

2 に答える 2

0

CellViewModelsのコレクションに基づいて動的オブジェクトを生成できます

これを見る

Silverlightアプリケーション用の軽量DataTable

よろしくお願いします。

ブルーノロシャ

于 2010-07-09T09:07:57.040 に答える
0

ここで自分の質問に答えます。

生成された列の SortMemberPath を RowVM.Cells コレクションのインデックス番号に設定することでこれを解決し、RowVM に SortOnMe プロパティを追加しました。

ユーザーがデータグリッドを並べ替えると、インデックス番号 (SortMemberPath から取得) を含む SortDescription が PagedCollectionView に追加されます。以下のメソッドで PagedCollectionView の propertychanged イベントをリッスンすることで、これを監視します。PagedCollectionView に "SortOnMe" で並べ替えるように指示する新しい SortDescription を追加し、問題のセルから並べ替えるデータを row.SortOnMe にコピーします。

private bool _currentlySorting;
private void PagedCollectionView_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    var pcv = (PagedCollectionView)sender;
    int columnIndex = 0;
    if (!_currentlySorting && e.PropertyName == "SortDescriptions" && pcv.SortDescriptions.Count == 1 && int.TryParse(pcv.SortDescriptions[0].PropertyName, out columnIndex)) {
        _currentlySorting = true; 
        pcv.SortDescriptions.Add(new SortDescription("SortOnMe", pcv.SortDescriptions(0).Direction));
        foreach (RowViewModel row in pcv.SourceCollection) {
            row.SortOnMe = row.Cells(columnIndex).Content;
        }
        _currentlySorting = false;
    }
}

正直なところ、これはかなり醜い解決策です。しかし、それは機能し、私は今、この壁に頭をぶつけるのに多くの時間を費やしてきました.

PagedCollectionView はシール クラスであるため (なぜ?!)、これを実行する唯一の方法は、独自の PagedCollectionView を作成し、そこで並べ替えを処理することです。

于 2010-07-12T10:26:39.160 に答える