2009-07-07 2 views
0

В Xaml, предположит, что у меня есть CollectionViewSource кто есть источник установлен на наблюдаемые коллекции объектов типа ордена:WPF: CollectionViewSource размещая сгруппирован по свойству

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, спросить - СПРОСИТЬ. Проблема заключается в том, что мне нужно заказы, которые будут отображаться в текущем формате

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  

Любая помощь очень ценится -

ответ

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, но для этого ответа это немного сложнее). Тогда все, что вам нужно сделать, это привязать к коллекции этих объектов, и все готово.

+0

Благодарим за это - сделаем трюк. Угадайте, что я надеюсь сохранить базовый источник данных как можно более простым (ObservableCollection ), и пусть какое-то вспомогательное волшебство заменяет процедурный код. – 2009-07-07 14:52:24

Смежные вопросы