自定义评估数据网格中的列和Observable Collection绑定到DataGrid列

时间:2014-05-09 15:51:37

标签: c# wpf binding datagrid

情况:一般情况下:我有一张光盘,想要测量厚度。测量系统是两个传感器,它们彼此之间具有确定的距离。然后将光盘放在这些传感器之间,然后测量它们各自与光盘的距离。

精确:厚度评估为多个值的平均值。因此,我测量特定半径的厚度,然后旋转光盘并将整个旋转的平均值作为该特定半径的平均值。然后,总平均值取5个这样的半径测量值。

要求:应该有一个如下所示的表:

| radius | mean thickness | deviation|
--------------------------------------
|  5cm   |    700µm       |    10µm  |
|  7cm   |    702µm       |    11µm  |
|  9cm   |    695µm       |    17µm  |
| 11cm   |    699µm       |     9µm  |
| 12cm   |    703µm       |    12µm  |
--------------------------------------
mean:         700µm            10µm

一般问题:我该如何实现?

我做了什么:我创建了一个类名Disc,如下所示:

public class Disc
{
    private ObservableCollection<double> measuredRadii;
    public ObservableCollection<double> MeasuredRadii { get { return measuredRadii; } }

    private ObservableCollection<DistanceMeasurementsResults> measurementValues;
    public ObservableCollection<DistanceMeasurementsResults> MeasurementValues { get { return measurementValues; } }

    public Disc()
    {
        // these radii are read from settings file
        measuredRadii = new ObservableCollection<double>() { 5, 7, 9, 11, 12 };
        measurementValues = new ObservableCollection<DistanceMeasurementsResults>();
    }

    public void AddMeasurementsResults(DistanceMeasurementsResults results)
    {
        measurementValues.Add(results);
    }
}

正如您所看到的,有一个DistanceMeasurementsResults类:

public class DistanceMeasurementsResults
{
    public Point Position;
    public double DistanceFromSensor1;
    public double DistanceFromSensor2;
}

Position的半径为X,角度为Y

为了实现该表,我尝试在MainWindow.xaml中使用DataGrid。我想我会将disc.MeasuredRadii中的半径填入第一列,然后计算每行的平均厚度,并使用如下的整齐小函数:让我们假设我有当前行索引为rowIndex。然后列中的那一行的平均厚度&#34;平均厚度&#34;将计算如下:

var measurementValuesWithCurrentRadius = disc.MeasurementValues.Where(x => x.Position.X == disc.MeasuredRadii[rowIndex]);
var measuredThicknesses = measurementValuesWithCurrentRadius.Select(x => (DISTANCE_BETWEEN_SENSORS - x.DistanceFromSensor1 - x.DistanceFromSensor2));
double measuredThicknesses = measuredDistances.Average();

我希望我最终可以将此方法绑定到第二列(使用Header&#34;表示厚度&#34;)。

相关的MainWindow.xaml如下所示:

<DataGrid x:Name="MeasureDataGrid" IsReadOnly="True" AutoGenerateColumns="False">
</DataGrid>

然后我尝试在代码隐藏(MainWindow.xaml.cs)中填充DataGrid。起初我只想在DataGrid中看到半径,但此时我已经失败了......

public partial class MainWindow : Window
{
    private Disc disc;

    public MainWindow()
    {
        disc = new Disc();

        DataGridTextColumn radiusColumn = new DataGridTextColumn();
        radiusColumn.Header = "radius";
        radiusColumn.Binding = new Binding("MeasuredRadii") { Source = this.disc };
        MeasureDataGrid.Columns.Add(radiusColumn);
    }
}

当我这样做时,我得到一个空白的DataGrid ......

具体问题

  1. 如何将disc.MeasuredRadii绑定到DataGrid的第一列?
  2. 如何使用给定的函数计算其他列?
  3. 重要:我不想在Disc课程中添加更多会员。因为它已经拥有所有相关数据。我想在表格中做更多的静力学,我不想为所有这些静态数据创建一个字段,因为:如果我不想显示所有这些静态数据该怎么办?然后我将不得不在视图中更改原因。这违反了我的个人规则......

    编辑:我来自Winforms,我认为我可以使用类似CellFormating事件的东西将我整洁的小方法绑定到DataGrid。 DataGrids中有类似的内容吗?

1 个答案:

答案 0 :(得分:0)

首先,您的绑定无效,因为您绑定了一组双打,因此您没有属性名称。您还没有为DataGrid设置ItemsSource。此代码修复了该问题。

        DataGridTextColumn radiusColumn = new DataGridTextColumn();
        radiusColumn.Header = "radius";
        radiusColumn.Binding = new Binding("");
        MeasureDataGrid.Columns.Add(radiusColumn);

        MeasureDataGrid.ItemsSource = disc.MeasuredRadii;

但是,我相信你真正应该做的是创建一个包含你想要显示的属性的类的集合。这并不一定意味着新成员,只是使用你的整齐函数来计算你需要的东西。

以下是我建议的内容(此类的集合将替换Disc类中的MeasuredRadii和MeasurementValues)。只是一个建议......

public class Measurement
{
    private double measuredRadius = 0.0;
    public double MeasuredRadius { get { return measuredRadius; } set { measuredRadius = value; } }
    public double MeasuredThickness
    {
        get
        {
            var measurementValuesWithCurrentRadius = MeasurementValues.Where(x => x.Position.X == MeasuredRadius);
            var measuredDistances = measurementValuesWithCurrentRadius.Select(x => (DISTANCE_BETWEEN_SENSORS - x.DistanceFromSensor1 - x.DistanceFromSensor2));
            return measuredDistances.Average();
        }
    }

    private ObservableCollection<DistanceMeasurementsResults> measurementValues;
    public ObservableCollection<DistanceMeasurementsResults> MeasurementValues { get { return measurementValues; } }

}