按项目中的多个项目排序

本文关键字:项目 排序 | 更新日期: 2023-09-27 17:56:38

All,

我有以下课程

public class MyCoolClass
{
    public string Field1{ get; set; }
    public int? Field2{ get; set; }
}

我还有另一节课

public class MyOtherClass
{
    ///a bunch of neat properties
    public MyCoolClass CoolClass { get; set; }
}

我有一个绑定到的 MyOtherClass 集合:C#:

public ObservableCollection<MyOtherClass> MyCoolDataSource { get; }

XAML:

<GroupBox DataContext="{Binding Path=MyCoolDataSource, UpdateSourceTrigger=PropertyChanged}" Header="Test DataGrid">
    <DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <!--A bunch of neat fields-->
            <DataGridComboBoxColumn Header="CoolClass" SelectedItem={"Binding Path=CoolClass, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
                <DataGridComboBoxColumn.ItemTemplate>
                    <!--DataTemplate that shows all properties of MyCoolClass-->
                </DataGridComboBoxColumn.ItemTemplate>
            </DataGridComboBoxColumn>
        </DataGrid.Columns>
    </DataGrid>
</GroupBox>

现在,我的问题是,假设我希望选择按某个字段排序(使用 .Net 4.0)。 在 WPF 中,这没有问题,我们只使用 SortMemberPath。 但是,假设我想按 MyCoolClass 中的所有字段对 DataGrid 中的 CoolClass 列进行排序。 这是否可以纯粹从 XAML 完成,或者我是否坚持在 C# 中创建一个组合这两个字段以进行排序的属性?

谢谢。

按项目中的多个项目排序

您可以尝试使用 Linq。我已经用List替换了ObservableCollection,但逻辑应该是相同的。

List<MyOtherClass> MyCoolDataSource = new List<MyOtherClass>();
MyCoolDataSource.Add(new MyOtherClass { CoolClass = new MyCoolClass { Field1 = "Z", Field2 = 123 } });
MyCoolDataSource.Add(new MyOtherClass { CoolClass = new MyCoolClass { Field1 = "A", Field2 = 3 } });
MyCoolDataSource.Add(new MyOtherClass { CoolClass = new MyCoolClass { Field1 = "J", Field2 = 4 } });
MyCoolDataSource.Add(new MyOtherClass { CoolClass = new MyCoolClass { Field1 = "K" } });
var sortedByField1 = MyCoolDataSource.OrderBy(e => e.CoolClass.Field1).ToList();
var sortedByField2 = MyCoolDataSource.OrderBy(e => e.CoolClass.Field2).ToList();
//display
Console.WriteLine("Ordered by first filed");
sortedByField1.ForEach(e => {
    Console.WriteLine(string.Format("Field 1: {0}, Field 2: {1}", e.CoolClass.Field1, e.CoolClass.Field2));
});
Console.WriteLine("Ordered by second filed");
sortedByField2.ForEach(e => {
    Console.WriteLine(string.Format("Field 1: {0}, Field 2: {1}", e.CoolClass.Field1, e.CoolClass.Field2));
});