我正在使用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。
答案 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");
}