2012-05-02 22 views
1

私は、DataGridのデータソースをObservableCollection of cellsにバインドする方法を理解しようとしています。特に、私は以下のクラスのインスタンスを保持のObservableCollection持っている:私のDataGridで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)); 
     } 
    } 
} 

を、私は(私はTemplateColumnsに価格と、各セルにおける「ストライク」の変数を使用しています)、これらのクラスを表示したいです"underlyingTicker" [4文字ストリング]と "spread" [バックグラウンドコーディングで定義された6つの可能な値のうちの1つを取ります]によってグループ化されます。

私はのObservableCollectionにDataGridのDataContextのをバインドする際に、現在、それは行として各「オプション」を示している - と私は上のペアのグループに何を指定する方法を見つけ出すことはできません...

この私のデータグリッドは次のようになります: enter image description here

ありがとうございました - kcross!

+1

あなたのDataGridのItemSource =何{バインディング...}、のように見えるあなたコラムのにも少なくとも一つのコードサンプルと、それはですバインディング?また、どのようなexacltyあなたが意味する: "と私はペアをグループ化する方法を指定する方法を把握することはできません" –

答えて

1

Dtexのように私はあなたがしたいことを完全に理解していません。しかし、私は、うまくいけば簡単に始めようとしました。 DataGridIEnumerable(好ましくは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

素晴らしい - ありがとう! – keynesiancross

関連する問題