这是我的xaml,告诉collectviewsource排序属性名称。
<CollectionViewSource Source="{Binding Contacts}" x:Key="contactsCollection" Filter="CollectionViewSource_Filter">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="DisplayName" />
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
上面的xaml运行正常,但我遇到的问题是我不知道如何为SortDescription PropertyName提供变量值。我的viewmodel中有一个属性,告诉我要对哪个属性进行排序,但是我无法将此属性绑定到SortDescription的PropertyName字段。
有什么办法吗?
答案 0 :(得分:7)
您可以在后面的代码中设置排序说明。
XAML:
<Window.Resources>
<CollectionViewSource Source="{Binding People}" x:Key="_peopleCVS" />
</Window.Resources>
<StackPanel>
<ListBox
ItemsSource="{Binding Source={StaticResource _peopleCVS}}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Name}" Margin="5,0"/>
<TextBlock Text="{Binding Path=Age}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<ComboBox SelectionChanged="ComboBox_SelectionChanged">
<ComboBoxItem>Age</ComboBoxItem>
<ComboBoxItem>Name</ComboBoxItem>
</ComboBox>
</StackPanel>
代码背后:
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
namespace CollectionViewSourceDemo
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
People = new List<Person>();
People.Add(new Person("Bob", 34));
People.Add(new Person("Sally", 12));
People.Add(new Person("Joe", 56));
People.Add(new Person("Mary", 23));
DataContext = this;
}
public List<Person> People { get; private set; }
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ComboBoxItem comboBoxItem = (sender as Selector).SelectedItem as ComboBoxItem;
string sortProperty = comboBoxItem.Content as string;
CollectionViewSource cvs = FindResource("_peopleCVS") as CollectionViewSource;
cvs.SortDescriptions.Clear();
cvs.SortDescriptions.Add(new SortDescription(sortProperty, ListSortDirection.Ascending));
}
}
public class Person
{
public Person(string name, int age)
{
Name = name;
Age = age;
}
public string Name { get; private set; }
public int Age { get; private set; }
}
}