2012-05-02 2 views
1

Я пытаюсь выяснить, как связать источник данных DataGrid с ObservableCollection из 'cells'. В частности, у меня есть ObservableCollection, который содержит экземпляры следующего класса:WPF DataGrid - привязка к коллекции 'cells'

public class Option : INotifyPropertyChanged 
{ 
    public Option() 
    { 
    } 

    // +-+- Static Information +-+- 
    public double spread = 0;   
    public double strike = 0;   
    public int daysToExpiry = 0; 
    public int put_call; // 0 = Call, 1 = Put 

    // Ticker References 
    public string fullTicker = ""; 
    public string underlyingTicker = ""; 

    //+-+-Properties used in Event Handlers+-+-// 
    private double price = 0; 
    public double Price 
    { 
     get { return price; } 
     set 
     { 
      price = value; 
      NotifyPropertyChanged("Price"); 
     } 
    } 

    //+-+-+-+- Propoerty Changed Event & Hander +-+-+-+-+-// 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(string info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 
} 

На моем DataGrid, я хочу, чтобы отобразить эти классы (я использую TemplateColumns цену и переменные забиваться в каждой ячейке) так что они сгруппированы под «baseTicker» [который представляет собой строку из 4 символов] и «spread» [который принимает 1 из 6 возможных значений, определенных в фоновом кодировании].

В настоящее время, когда я связываю DataContext в DataGrid в к ObservableCollection, это показывает каждый вариант «» в качестве строки - и я не могу понять, как определить, что сгруппировать пары по ...

Этих как мой datagrid выглядит сейчас: enter image description here

Большое спасибо - kcross!

+1

что ItemSource вашего DataGrid в = {Binding ...} выглядеть, а также по крайней мере один пример кода из вас колонки, и это связывание? Также, что вы имеете в виду: «и я не могу понять, как указать, что группировать пары на« –

ответ

1

Как и Dtex, я не совсем понимаю, что вы хотите сделать. Но я попытался сделать упрощение, которое, надеюсь, заставит вас начать. Вы должны передать DataGrid a IEnumerable (предпочтительно ObserrvableCollection) объектов. Отдельные объекты будут переводить в строки, свойства этих объектов будут переводиться в заголовки столбцов.

Итак, если вы хотите, чтобы заголовки столбцов представляли кратность стандартного отклонения (справа?), Вам нужно будет создать объект, который имеет эти кратность как свойства. Полученные ячейки будут содержать классы Option. Чтобы представить их, вам необходимо определить DataTemplate или переопределить функцию ToString(). Я думаю, что вы сделали это, судя по вашему примеру.

Код позади:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Windows; 
using System.Windows.Controls; 
using System.ComponentModel; 
using System.Collections.ObjectModel; 
namespace DataGridSpike 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     private List<Option> _unsortedOptions; 
     private ObservableCollection<OptionRow> _groupedOptions; 

     public ObservableCollection<OptionRow> GroupedOptions 
     { 
      get { return _groupedOptions; } 
      set { _groupedOptions = value; } 
     } 

     public MainWindow() 
     { 
      var rnd=new Random(); 
      InitializeComponent(); 

      //Generate some random data 
      _unsortedOptions=new List<Option>(); 
      for(int element=0;element<50;element++) 
      { 
       double column=rnd.Next(-2,3); 
       int row=rnd.Next(0,9); 

       _unsortedOptions.Add(new Option { ColumnDefiningValue = column, RowDefiningValue = row }); 
      } 

      //Prepare the data for the DataGrid 
      //group and sort 
      var rows = from option in _unsortedOptions 
         orderby option.ColumnDefiningValue 
         group option by option.RowDefiningValue into optionRow 
         orderby optionRow.Key ascending 
         select optionRow; 

      //convert to ObservableCollection 
      _groupedOptions = new ObservableCollection<OptionRow>(); 
      foreach (var groupedOptionRow in rows) 
      { 
       var groupedRow = new OptionRow(groupedOptionRow); 
       _groupedOptions.Add(groupedRow); 
      } 

      //bind the ObservableCollection to the DataGrid 
      DataContext = GroupedOptions; 
     } 
    } 

    public class OptionRow 
    { 
     private List<Option> _options; 

     public OptionRow(IEnumerable<Option> options) 
     { 
      _options = options.ToList(); 
     } 

     public Option Minus2 
     { 
      get 
      { 
       return (from option in _options 
         where option.ColumnDefiningValue == -2 
         select option).FirstOrDefault(); 
      } 
     } 
     public Option Minus1 
     { 
      get 
      { 
       return (from option in _options 
         where option.ColumnDefiningValue == -1 
         select option).FirstOrDefault(); 
      } 
     } 
     public Option Zero 
     { 
      get 
      { 
       return (from option in _options 
         where option.ColumnDefiningValue == 0 
         select option).FirstOrDefault(); 
      } 
     } 
     public Option Plus1 
     { 
      get 
      { 
       return (from option in _options 
         where option.ColumnDefiningValue == 1 
         select option).FirstOrDefault(); 
      } 
     } 
     public Option Plus2 
     { 
      get 
      { 
       return (from option in _options 
         where option.ColumnDefiningValue == 2 
         select option).FirstOrDefault(); 
      } 
     } 
    } 

    public class Option:INotifyPropertyChanged 
    { 

     public override string ToString() 
     { 
      return string.Format("{0}-{1}", RowDefiningValue.ToString(),ColumnDefiningValue.ToString()); 
     } 

     private double _columnDefiningValue; 
     public double ColumnDefiningValue 
     { 
      get{return _columnDefiningValue;} 
      set{_columnDefiningValue = value; 
       OnPropertyChanged("ColumndDefiningValue"); 
      } 
     } 

     private int _rowDefiningValue; 
     public int RowDefiningValue 
     { 
      get{return _rowDefiningValue;} 
      set{_rowDefiningValue = value; 
       OnPropertyChanged("RowDefiningValue"); 
      } 
     } 

     private void OnPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged!=null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
    } 
} 

Часть XAML:

<Window x:Class="DataGridSpike.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <DataGrid ItemsSource="{Binding}"/> 
    </Grid> 
</Window> 
+0

awesome - спасибо! – keynesiancross

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