繁体   English   中英

对数据网格中的列进行自定义评估,并将Observable Collection绑定到DataGrid的列

[英]custom evaluation of columns in data grid and Binding of Observable Collection to a Column of 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

一般问题 :如何实现?

我做了什么 :我创建了一个名为name的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 然后,在“平均厚度”列中该行的平均厚度将计算如下:

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();

我希望我最终可以将此方法绑定到第二列(标题为“平均厚度”的列)。

相关的MainWindow.xaml如下所示:

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

然后,我尝试将DataGrid填充在背后的代码(MainWindow.xaml.cs)中。 起初,我只是想查看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. 如何使用给定的功能计算其他列?

重要提示 :我不想向Disc类添加更多成员。 因为它已经保存了所有相关数据。 而且我想在表中做更多的静态操作,并且不想为所有这些静态数据创建一个字段,因为:如果我不想显示所有这些静态数据,该怎么办? 然后,由于视图更改,我将不得不更改模型。 这违反了我的个人规定...

编辑 :我来自Winforms,我想我可以使用像CellFormating事件之类的东西来将整洁的小方法绑定到DataGrid。 DataGrids中是否有类似的东西?

首先,您的绑定不起作用,因为您要绑定到双打的集合,因此没有属性名称。 另外,您还没有为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; } }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM