WPF:CollectionViewSource显示按属性分组

时间:2009-07-07 13:28:21

标签: 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;
        set;
    }
}
public enum OrderSide
{
    BID,
    ASK
}

投标订单是Side属性为BID的订单,ask是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}
        };

它将呈现为

1
 10    11
 9     11.5

2
 21    24
 20    

我猜我需要使用过滤的CollectionViewSource和datatemplateselectors的组合..?

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

1 10    11
  10    11
  9     11.5

2 21    24
  21    24
  20    

非常感谢任何帮助 -

1 个答案:

答案 0 :(得分:0)

快速而又脏 - 将您的订单包装在表达您的分组逻辑的类中

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;}
}

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