WPF:CollectionViewSource按属性分组显示

WPF:CollectionViewSource按属性分组显示,wpf,data-binding,sorting,grouping,Wpf,Data Binding,Sorting,Grouping,在Xaml中,假设我有一个CollectionViewSource,其源设置为类型为Order的对象的可观察集合: public class Order { public int ContractID { get; set; } public double? Price { get; set; } public OrderSide Side { get;

在Xaml中,假设我有一个CollectionViewSource,其源设置为类型为Order的对象的可观察集合:

public class Order
{
    public int ContractID
    {
        get;
        set;
    }
    public double? Price
    {
        get;
        set;
    }
    public OrderSide Side
    {
        get;
        set;
    }
}
public enum OrderSide
{
    BID,
    ASK
}
投标订单是一个订单,其附带属性是投标,要求是要求。问题是我需要以当前格式显示订单

Grouped by ContractID
    Bids (Descending)      Asks (Ascending)
更具体地说,问题是我需要出价,并要求并排显示

例如,对于以下集合

var orders = new List<Order>()
        {
            new Order(){ContractID=1,Price=10,Side=OrderSide.BID},
            new Order(){ContractID=1,Price=11,Side=OrderSide.ASK},
            new Order(){ContractID=1,Price=9,Side=OrderSide.BID},
            new Order(){ContractID=1,Price=11.5,Side=OrderSide.ASK},
            new Order(){ContractID=2,Price=20,Side=OrderSide.BID},
            new Order(){ContractID=2,Price=24,Side=OrderSide.ASK},
            new Order(){ContractID=2,Price=21,Side=OrderSide.BID}
        };
我猜我需要结合使用过滤的CollectionViewSource和datatemplateselectors

作为额外的奖励,我希望能够在分组行中显示最佳出价和最佳询问。因此,使用相同的数据,它将被渲染为

1 10    11
  10    11
  9     11.5

2 21    24
  21    24
  20    
非常感谢的任何帮助-

快速而肮脏-将您的订单包装在一个表示分组逻辑的类中

public class OrdersByContractId
{
  public int ContractId {get;set;}
  // set best bid and ask when this is updated
  public ObservableCollection<Order> Orders {get;set;}
  public Order BestBid {get;set;}
  public Order BestAsk {get;set;}
}
公共类OrdersByContractId
{
公共int压缩{get;set;}
//设置最佳出价,并在更新时询问
公共可观察收集顺序{get;set;}
公共秩序最佳出价{get;set;}
公共秩序最佳任务{get;set;}
}

然后,您可以查询存储库,生成订单并对其进行分组,确定最佳出价和请求,并填写订单合同(这可以使用Linq to Sql来完成,但这个答案有点复杂)。然后,您所要做的就是绑定到这些对象的集合,您就完成了。

谢谢您的帮助,这样就可以了。我想我希望使底层数据源尽可能简单(ObservableCollection),并让一些数据绑定向导代替过程代码。
public class OrdersByContractId
{
  public int ContractId {get;set;}
  // set best bid and ask when this is updated
  public ObservableCollection<Order> Orders {get;set;}
  public Order BestBid {get;set;}
  public Order BestAsk {get;set;}
}