2

ObservableCollectionカスタムオブジェクトが含まれています。通常、アイテムはリストの最後に追加されます

私が探しているもの:

  • リストの最初から追加されるアイテム。
  • これはUIにのみ表示される場合があります。私のプログラム全体は、すでにこのリスト内のデータの位置を使用しています。そのため、その中のオブジェクトは、コードビハインドで順序を変更しない場合があります。

これObservableColectionは、Buttonオブジェクト(カスタムスタイル)を保持します。これらのボタンは、水平レイアウトでaListBoxと内部に表示されてStackPanelいます(ボタンが互いに適切に配置されるように)。

問題:

作成されるすべてのボタンはを受け取りますDateTime。新しく追加されたボタンには、常にその前のボタンよりも新しい日付があります。このためのすべての計算は、タイマー内で実行されます(現在は毎秒実行されています)。

なので今回は基本的に並べ替え中ですが、3つのボタンのように突然ボタンが左側ではなく右側に配置されます。

例えば:

Btn3:14:15:45(正しい) Btn4:14:16:00(間違っている) Btn2:14:15:32(正しい)Btn1:14:04:17(正しい)

最初の3つのボタンは、毎回リストの先頭に適切に追加されます。そしていきなり2位に4点目が追加されます。いつも時間を比較しているわけではないようですね。ボタンが作成されるたびに、CollectionViewSourceメソッドが呼び出されます。

何か問題がありますか、CollectionViewSourceそれともこれを処理するためのより良い方法がありますか?

4

4 に答える 4

4

にやにや笑いの場合は、XAMLで並べ替えを試してみますか?私はこれらが同じ名前ではないことを知っていますが、これは動作中のコードからのものです。私は日付でソートしていませんが、DocPropsから何百もの追加と削除を行ったので、ソートは壊れません。

        <ListBox.DataContext>
            <CollectionViewSource Source="{Binding Path=DocProps}">
                <CollectionViewSource.SortDescriptions>
                    <scm:SortDescription PropertyName="Date" Direction="Desc" />
                </CollectionViewSource.SortDescriptions>
            </CollectionViewSource>
        </ListBox.DataContext>

私の他の考えは、日付の文字列表現をソートして間違っている可能性があるということです。たぶん、ソートするインデックス001〜00nを作成します。

私はこのコレクションに日付を追加しました、そしてそれは私から働きました。しかし、日付をソート可能な形式にする必要がありました。

     Text="{Binding Path=Date, Mode=OneWay, StringFormat={}{0:s}}"
于 2012-05-02T13:09:15.450 に答える
0

よく理解していれば、のTicksプロパティを使用DateTimeして並べ替えます。これは、その性質上非常に正確であり、コースのプロパティは単純な数値であるためです。

于 2012-05-02T12:31:41.080 に答える
0

ICollectionViewは、コードスニペットのようにインスタンスフィールドまたはローカル変数ですか?

インスタンスフィールドである必要があります。そうすれば、並べ替えが機能します。ところで、私はあなたのスニペットを試し、icollectionviewをフィールドに変更しましたが、それは機能します。

于 2012-05-02T12:32:28.977 に答える
0

コメントに投稿されたSivaのリンクをたどり、そこから別のリンクをたどると、最終的にはhttp://connect.microsoft.com/VisualStudio/feedback/details/592897/collectionviewsource-sorting-only-the-になります。誰かが回避策を投稿した初めてのソースにバインドされています。この回避策はDataGrid用に作成されていますが、使用しているコントロールに合わせて調整できます。

GregBachratyによって2011年2月28日午前6時50分に投稿されました

独自のDataGridを実装します。

public class SDataGrid : DataGrid
{
    static SDataGrid()
    {
        ItemsControl.ItemsSourceProperty.OverrideMetadata(typeof(SDataGrid), new FrameworkPropertyMetadata((PropertyChangedCallback)null, (CoerceValueCallback)null));
    }
}

現在の実装で強制コールバックが行う唯一のことは、ソートの説明を明確にすることです。メタデータをオーバーライドすることで、このコードを簡単に「カット」できます。Silverlightでは実行できません:OverrideMetadataAPIは公開されていません。Silverlightがこのバグの影響を受けるかどうかはわかりませんが。その他のリスクと副作用が適用される場合があります。

于 2012-05-02T13:19:47.263 に答える