Dtexのように、私はあなたが何をしたいのかを完全には理解していません。しかし、私はあなたが始められることを願って単純化しようとしました。DataGrid
オブジェクトの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>