如何使用CollectionViewSource.SortDescription停用排序?

时间:2017-09-20 14:47:01

标签: wpf sorting collectionviewsource

我正在使用CollectionViewSource并在xaml中设置了CollectionViewSource.SortDescription属性,用于对特定属性上的集合进行排序。

但是,现在我有一个案例,如果某些条件成立,或者集合属于特定类型,我不需要应用排序,而只是绑定集合因为它来自视图模型。

我不想将XAML的排序移到查看模型,因为它使问题复杂化。我想将排序保留到CollectionViewSource.SortDescription,但是想知道是否有办法根据某些标志将其关闭。例如。我可以在我的视图模型中公开属性IgnoreSort,然后以某种方式将其用于关闭CollecitonViewSource排序

以下是xaml代码 -

资源:

<UserControl.Resources>
    <CollectionViewSource x:Key="PeopleItemsSource" Source="{Binding Department.ActivePeople}">
        <CollectionViewSource.SortDescriptions>
            <scm:SortDescription PropertyName="DisplaySortOrder" />
        </CollectionViewSource.SortDescriptions>
    </CollectionViewSource>
</UserControl.Resources>

以下是使用上面声明的资源

的控件
 <ItemsControl x:Name="peopleitems"
            Grid.Row="1"
            ItemsSource="{Binding Source={StaticResource PeopleItemsSource}}"/>

注意:此处未添加项目模板以简化xaml。

2 个答案:

答案 0 :(得分:1)

这里是我写的一个小例子,我不认为你有适应项目的问题,它使用DataTriggers有条件地选择项目源,它没有使用代码后面,你在这里看到的代码只是设置datacontext,项目集合等。复制粘贴这个代码到一个新的WPF项目并看到它正常工作

MainWindow.xaml

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApplication1"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525"
    xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
    >
<Window.Resources>
    <CollectionViewSource x:Key="colSrc" Source="{Binding MyList}">
        <CollectionViewSource.SortDescriptions>
            <scm:SortDescription/>
        </CollectionViewSource.SortDescriptions>
    </CollectionViewSource>
    <Style TargetType="ItemsControl" x:Key="ic">
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsSorted}" Value="True">
                <Setter Property="ItemsSource" Value="{Binding Source={StaticResource ResourceKey=colSrc}}"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding IsSorted}" Value="False">
                <Setter Property="ItemsSource" Value="{Binding MyList}"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

<Grid>
    <StackPanel>
        <CheckBox IsChecked="{Binding IsSorted}"/>
        <ItemsControl Grid.Row="1" Style="{StaticResource ic}"/>
    </StackPanel>
</Grid>

MainWindow.xaml.cs

namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window,INotifyPropertyChanged
{
    private bool isSorted;
    public bool IsSorted
    {
        get
        {
            return isSorted;
        }
        set
        {
            isSorted = value;
            OnPropertyChanged("IsSorted");
        }
    }
    private ObservableCollection<string> myList;

    public event PropertyChangedEventHandler PropertyChanged;

    public ObservableCollection<string> MyList
    {
        get
        {
            return myList;
        }
        set
        {
            myList = value;
            this.OnPropertyChanged("MyList");
        }
    }
    public MainWindow()
    {
        InitializeComponent();

        this.MyList = new ObservableCollection<string>() {
            "C",
            "B",
            "A"
        };
        this.DataContext = this;

    }
    private void OnPropertyChanged(string p)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(p));
        }
    }
}
}

答案 1 :(得分:-1)

您必须通过代码执行此操作 - 添加或删除SortProperties

internal void Sort(PropertyModel model)
    {
        PropertyViewModel prop = SortProperties.Find(p => p.Data == model);

        IEnumerable<SortDescription> result =
            Books.SortDescriptions.Cast<SortDescription>().Where(p => p.PropertyName == prop.Data.FullName);

        if (result != null && result.Count() == 1)
        {
            Books.SortDescriptions.Remove(result.First());
        }
        else
        {
            Books.SortDescriptions.Add(new SortDescription(prop.Data.FullName, ListSortDirection.Ascending));
        }

        RaisePropertyChanged("Books");
    }