在Xaml中绑定CollectionViewSource SortDescription的PropertyName

7
这是我的XAML代码,用于指定CollectionViewSource的排序属性名称。
<CollectionViewSource Source="{Binding Contacts}" x:Key="contactsCollection" Filter="CollectionViewSource_Filter">
            <CollectionViewSource.SortDescriptions>
                <scm:SortDescription PropertyName="DisplayName" />
            </CollectionViewSource.SortDescriptions>
</CollectionViewSource>

上面的xaml工作得很好,但我遇到的问题是我不知道如何给SortDescription PropertyName赋变量值。我在我的视图模型中有一个属性,告诉我应该按哪个属性进行排序,但我无法将此属性绑定到SortDescription的PropertyName字段。

有什么办法吗?

1个回答

8
你可以在代码后端设置排序描述。
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; }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接