SortFilter排序筛选器

实现效果:

clipboard.png

clipboard.png

关键词:

  1. DataContextChanged
  2. ListCollectionView+SortDescriptions
  3. MoveCurrentToPrevious、MoveCurrentToFirst、MoveCurrentToNext、MoveCurrentToLast

页面代码:

<DockPanel Name="rootElement" DataContextChanged="StartHere" Height="400">
    <DockPanel.DataContext>
        <Binding Source="{StaticResource MyDataSource}"/>
    </DockPanel.DataContext>

数据上下文变动时发生:
在本例中进行前后数据浏览时必须重新获取根元素默认集合视图,否则会出现选定项为空的现象,出现bug。

public void StartHere(object sender, DependencyPropertyChangedEventArgs args)
{
    MyCollectionView = (ListCollectionView) CollectionViewSource.GetDefaultView(rootElement.DataContext);
}

排序按钮方法:

private void OnClick(object sender, RoutedEventArgs args)
        {
            var button = sender as Button;
            //Sort the data based on the column selected
            MyCollectionView.SortDescriptions.Clear();
            switch (button.Name)
{
    case "orderButton":
        MyCollectionView.SortDescriptions.Add(new SortDescription("OrderItem",
            ListSortDirection.Ascending));
        break;
    case "customerButton":
        MyCollectionView.SortDescriptions.Add(new SortDescription("Customer",
            ListSortDirection.Ascending));
        break;
    case "nameButton":
        MyCollectionView.SortDescriptions.Add(new SortDescription("Name",
            ListSortDirection.Ascending));
        break;
    case "idButton":
        MyCollectionView.SortDescriptions.Add(new SortDescription("Id",
            ListSortDirection.Ascending));
        break;
    case "filledButton":
        MyCollectionView.SortDescriptions.Add(new SortDescription("Filled",
            ListSortDirection.Ascending));
        break;
}
}

集合视图导航:

  1. OnButton 是应用程序中 Previous 和 Next 按钮的事件处理程序,用户可以使用这两个按钮导航数据集合。
  2. IsCurrentBeforeFirst 和 IsCurrentAfterLast 属性可分别报告当前记录指针是否到达列表的开头和结尾,以便相应地调用 MoveCurrentToFirst 和 MoveCurrentToLast。
  3. 该视图的 CurrentItem 属性会强制转换为 Order,以返回该集合中的当前顺序项。

//OnBrowse is called whenever the Next or Previous buttons
//are clicked to change the currency
private void OnBrowse(object sender, RoutedEventArgs args)
{
    var b = sender as Button;
    switch (b.Name)
    {
        case "Previous":
            if (MyCollectionView.MoveCurrentToPrevious())
            {
                feedbackText.Text = "";
                O = MyCollectionView.CurrentItem as Order;
            }
            else
            {
                MyCollectionView.MoveCurrentToFirst();
                feedbackText.Text = "At first record";
            }
            break;
        case "Next":
            if (MyCollectionView.MoveCurrentToNext())
            {
                feedbackText.Text = "";
                O = MyCollectionView.CurrentItem as Order;
            }
            else
            {
                MyCollectionView.MoveCurrentToLast();
                feedbackText.Text = "At last record";
            }
            break;
    }
}

以上O = MyCollectionView.CurrentItem as Order;仅保存当前选定项,暂未使用。
以下根据某项属性值判断进行筛选:
ListCollectionView.Filter 属性:一个委托,表示用于确定某个项是否适合包含在视图中的方法。

本例中根据order?.Filled == "No"进行筛选

//OnButton is called whenever the Next or Previous buttons
//are clicked to change the currency
private void OnFilter(object sender, RoutedEventArgs args)
{
    var b = sender as Button;
    switch (b.Name)
    {
        case "Filter":
            MyCollectionView.Filter = Contains;
            break;
        case "Unfilter":
            MyCollectionView.Filter = null;
            break;
    }
}

筛选方法:

public bool Contains(object de)
{
    var order = de as Order;
    //Return members whose Orders have not been filled
    return (order?.Filled == "No");
}

扩展:

  1. FrameworkElement.DataContextChanged 事件:此元素的所有数据绑定属性都可能会受到影响。 这适用于逻辑树中当前元素的所有子元素(这些子元素继承了数据上下文)以及当前元素本身。 所有这些现有绑定都必须重新解释新的 DataContext,并将重新计算绑定结果。 数据绑定引擎无法确定这些重新计算相对于引发 DataContextChanged 事件的顺序。 重新计算可以发生在该事件之前或之后,也可以发生在该事件过程中。

李志玮
22 声望34 粉丝

求索~~


引用和评论

0 条评论