【问题标题】:Sort by multiple items in itemtemlate按itemtemplate中的多个项目排序
【发布时间】:2013-01-13 15:27:30
【问题描述】:

全部,

我有以下课程

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# 中创建一个属性来组合这两个字段以进行排序?

谢谢。

【问题讨论】:

  • 你看过这个吗:stackoverflow.com/questions/2274690/…这可能会有所帮助。
  • 有趣。不过,我有两个问题。 1)这将如何与 DataGrid 一起工作(我应该添加排序需要按需),以及 2)出于某种原因,即使我引用了 WindowsBase,即使我可以在 ObjectBrowser 中看到有一个WindowsBase 库中的 System.ComponentModel,我似乎无法在我的 xaml 中为程序集 WindowsBase 声明 System.ComponentModel 命名空间。如果我尝试使用 xmlns:smc="clr-namespace:System.ComponentModel;assembly=WindowsBase" WindowsBase,我会得到一个未定义的 CLR 命名空间 o-O。

标签: c# wpf sorting wpfdatagrid


【解决方案1】:

您可以尝试使用 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));
});

【讨论】:

  • 刚才只注意到你需要一个XAML解决方案..我上面的解决方案不能算在那种情况下,对不起
  • 是的。这个想法是排序发生在视图中,而不影响底层数据的查询方式。如果我想使用 Linq,那么我会使用 OrderBy 和 ThenBy。
猜你喜欢
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-25
  • 1970-01-01
  • 1970-01-01
  • 2020-10-11
相关资源
最近更新 更多