0

アイテムにスケジュールされた日付があるスケジューリング プログラムに取り組んでいますが、ユーザーは選択した日付に対してこれを上書きすることを選択できます。これを実装するために、Item オブジェクトは ScheduledDate (DateTime) と ActualDate (DateTime?) の 2 つのプロパティを使用します。したがって、ActualDate プロパティが null の場合、ユーザーはこのアイテムのスケジュールをオーバーライドしていません。

私のビューの 1 つで、これらの項目をListBox実際の日付で並べ替えて表示する必要があります。私が抱えている問題はCollectionViewSource、これら 2 つのプロパティを使用して a を実装する方法です。

正しくないことはわかっていますが、次のようなものが必要です。

<CollectionViewSource x:Key="TransactionsViewSource"
                      Source="{Binding ElementName=ThisControl, 
                                       Path=Items}">
    <CollectionViewSource.SortDescriptions>
        <cm:SortDescription PropertyName="ActualDate ?? ScheduledDate"/>
    </CollectionViewSource.SortDescriptions>
</CollectionViewSource>

(ThisControl は、UserControlをホストするの名前ListBoxです)。

2 番目の SortDescriptor (以下のように) を追加すると、ActualDate、次に Scheduled Date で並べ替えられたリストが取得され、オーバーライドされたすべての項目がグループ化されます。これは望ましい動作ではありません。

<CollectionViewSource x:Key="TransactionsViewSource"
                      Source="{Binding ElementName=ThisControl, 
                                       Path=Items}">
    <CollectionViewSource.SortDescriptions>
        <cm:SortDescription PropertyName="ActualDate"/>
        <cm:SortDescription PropertyName="ScheduledDate"/>
    </CollectionViewSource.SortDescriptions>
</CollectionViewSource>

ありがとう。

4

2 に答える 2

1

UserControl私は最終的に、 LINQ を使用して基礎となるものをObservableCollectionソートしたままにする新しいメソッドをクラスに作成しました。次に、アイテムが編集されたとき (実際の日付がオーバーライドされたとき)、または新しいアイテムが追加されたときに、このメソッドを呼び出しました。最後にCollectionViewSource、XAML からを削除ListBoxし、Itemsプロパティ (既に依存関係プロパティとして持っていたもの) にバインドしました。結果は次のようになります。

XAML:

<ListBox ItemsSource="{Binding ElementName=ThisControl,
                               Path=Items}"/>

C#:

public static readonly DependencyProperty ItemsProperty =
    DependencyProperty.Register("Items",
                                typeof(ObservableCollection<MyItem>),
                                typeof(MyControl),
                                new UIPropertyMetadata(null));

public ObservableCollection<MyItem> Items
{
    get { return (ObservableCollection<MyItem>) GetValue(ItemsProperty); }
    set { SetValue(ItemsProperty, value); }
}

private void SortItems()
{
    Items = new ObservableCollection<MyItem>(Items.OrderBy(i => i.ActualDate ??
                                                                i.ScheduledDate));
}

次にSortItems()、コレクション内のアイテムまたはコレクション自体が変更された場所ならどこでも使用します。

これは完璧に機能し、新しいプロパティを作成して管理する必要はありませんでした。LINQ が作成するわずかなオーバーヘッドに耐えることができます。

于 2012-06-12T03:55:35.493 に答える
0

最も簡単な方法は、並べ替え用にもう 1 つプロパティを作成することだと思います。

public DateTime SortingDate
{
    get { return ActualDate ?? ScheduledDate; }
}

.

<CollectionViewSource.SortDescriptions>
    <cm:SortDescription PropertyName="SortingDate"/>
</CollectionViewSource.SortDescriptions>
于 2012-06-11T23:34:17.527 に答える