SortFilter排序筛选器
实现效果:
关键词:
- DataContextChanged
- ListCollectionView+SortDescriptions
- 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;
}
}
集合视图导航:
- OnButton 是应用程序中 Previous 和 Next 按钮的事件处理程序,用户可以使用这两个按钮导航数据集合。
- IsCurrentBeforeFirst 和 IsCurrentAfterLast 属性可分别报告当前记录指针是否到达列表的开头和结尾,以便相应地调用 MoveCurrentToFirst 和 MoveCurrentToLast。
- 该视图的 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");
}
扩展:
- FrameworkElement.DataContextChanged 事件:此元素的所有数据绑定属性都可能会受到影响。 这适用于逻辑树中当前元素的所有子元素(这些子元素继承了数据上下文)以及当前元素本身。 所有这些现有绑定都必须重新解释新的 DataContext,并将重新计算绑定结果。 数据绑定引擎无法确定这些重新计算相对于引发 DataContextChanged 事件的顺序。 重新计算可以发生在该事件之前或之后,也可以发生在该事件过程中。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。