1

データの要約を表示するコントロールを作成しています。このページでは、多くのアイテムを含むObservableColectionにコントロールをバインドしています。アイテムを時間で並べ替えるCollectionViewを作成しましたが、このコントロールでは、上位3つのアイテムのみを表示したいと思います。これを実現するためにコンバーターを作成しようとしましたが、リストをフィルター処理しようとするとすべての方法で「新しい」リストが返され、マスターObservableCollectionに新しいアイテムが追加されてもコントロールが更新されなくなります。

これを達成するためのクリーンな方法はありますか?いくつかのコレクションで同様のことをしなければならないので、何か一般的なものを作りたいと思います。

4

2 に答える 2

2

ViewModelパターンを使用している場合、クリーンな方法は、上位N個のアイテムを含む別のObservableCollectionを用意することです。そうすれば、バインディングは直接であり、モデルを変更するだけで3を任意のNに変更できます。

public class MyViewModel
{
    private ObservableCollection<string> myList;

    public ObservableCollection<string> MyList 
    { 
        get { return myList; }
        set { return myList; }
    }

    public Collection<string> MyListTop3 
    {
        get { return new Collection<string>(MyList.Take(3).ToList()); }
    }

    public MyViewModel() 
    {
        myList = new ObservableCollection<string>();

        myList.CollectionChanged += (sender, args) =>
        { 
            RaisePropertyChanged("MyListTop3");
        }; 
    } 
}

XAMLを介してのみそのケアをしたい場合(クリーンイーストの方法はありません):

<ListBox>

    <ListBox.Resources>
        <ContentPresenter x:Key="value0" Content="{Binding MyList[0]}"/>
        <ContentPresenter x:Key="value1" Content="{Binding MyList[1]}"/>
        <ContentPresenter x:Key="value2" Content="{Binding MyList[2]}"/>
    </ListBox.Resources>

    <ListBoxItem Content="{DynamicResource value0}"/>
    <ListBoxItem Content="{DynamicResource value1}"/>
    <ListBoxItem Content="{DynamicResource value2}"/>

</ListBox>

この例はListBoxを示していますが、他のコントロールで使用できます。

于 2013-02-04T20:17:45.597 に答える
1

これを行うには、CollectionViewの組み込みフィルタリングを使用できる場合があります。Filter述語では、元のコレクションを使用して、ビューのソートおよびインデックスのチェックと同じ方法でソートできます。

FilteredList = new ObservableCollection<string> { "One", "Two", "Three", "Four", "Five" };

_defaultView = CollectionViewSource.GetDefaultView(FilteredList);
_defaultView.SortDescriptions.Add(new System.ComponentModel.SortDescription(".", System.ComponentModel.ListSortDirection.Ascending));
_defaultView.Filter = o =>
{
    int index = FilteredList.OrderBy(s => s).ToList().IndexOf(o as string);
    return index >= 0 && index < 3;
};

また、アイテムが追加されるたびに、ビューが更新されることを確認する必要があります。これは、追加を行うコードに含めるか、CollectionChangedイベントのハンドラーに含めることによって行います。

FilteredList.Add(newItem);
_defaultView.Refresh();
于 2013-02-04T20:19:26.500 に答える