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 来处理它(不是cleaneast 方式):

<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 回答