C# 数据网格中列的自定义评估和可观测集合到数据网格列的绑定

C# 数据网格中列的自定义评估和可观测集合到数据网格列的绑定,c#,wpf,binding,datagrid,C#,Wpf,Binding,Datagrid,情况:一般情况下:我有一个圆盘,想测量厚度。测量系统是两个彼此之间有规定距离的传感器。然后将制动盘放置在这些传感器之间,然后测量它们与制动盘之间的距离 准确地说:厚度被评估为几个值的平均值。所以我测量了一个特定半径的厚度,然后旋转圆盘,取整个旋转的平均值作为该特定半径的平均值。然后,在5个这样的半径测量值上取总平均值 要求:应该有一个如下所示的表格: | radius | mean thickness | deviation| ----------------------------------

情况:一般情况下:我有一个圆盘,想测量厚度。测量系统是两个彼此之间有规定距离的传感器。然后将制动盘放置在这些传感器之间,然后测量它们与制动盘之间的距离

准确地说:厚度被评估为几个值的平均值。所以我测量了一个特定半径的厚度,然后旋转圆盘,取整个旋转的平均值作为该特定半径的平均值。然后,在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
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);
    }
}
<DataGrid x:Name="MeasureDataGrid" IsReadOnly="True" AutoGenerateColumns="False">
</DataGrid>
一般问题:我如何才能做到这一点

我所做的:我创建了一个类名和
光盘
,看起来像这样:

| 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
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);
    }
}
<DataGrid x:Name="MeasureDataGrid" IsReadOnly="True" AutoGenerateColumns="False">
</DataGrid>
位置
具有as
X
半径和as
Y
角度φ

为了实现该表,我尝试在MainWindow.xaml中使用DataGrid。我想我应该将
disc.MeasuredRadii
中的半径填充到第一列,然后用一个简洁的函数计算每行的平均厚度,如下所示:假设我的当前行索引为
行索引
。然后,“平均厚度”列中该行的平均厚度计算如下:

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如下所示:

| 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
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);
    }
}
<DataGrid x:Name="MeasureDataGrid" IsReadOnly="True" AutoGenerateColumns="False">
</DataGrid>
当我这样做的时候,我会得到一个空白的数据网格

具体问题

  • 如何将
    disc.MeasuredRadii
    绑定到DataGrid的第一列
  • 如何使用给定的函数计算其他列
  • 重要:我不想在
    光盘
    类中添加更多成员。因为它已经保存了所有相关的数据。我想在表中做更多的静态,我不想为所有这些静态数据创建一个字段,因为:如果我不想显示所有这些静态,该怎么办?然后,由于视图发生了变化,我必须更改模型。这是违反我个人规则的


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

    首先,您的绑定不起作用,因为您要绑定到一个double集合,因此您没有属性名。此外,您还没有为DataGrid设置ItemsSource。这段代码修复了这个问题

            DataGridTextColumn radiusColumn = new DataGridTextColumn();
            radiusColumn.Header = "radius";
            radiusColumn.Binding = new Binding("");
            MeasureDataGrid.Columns.Add(radiusColumn);
    
            MeasureDataGrid.ItemsSource = disc.MeasuredRadii;
    
    然而,我相信您真正应该做的是创建一个类的集合,该类包含您想要显示的属性。这并不一定意味着新成员,只是使用整洁函数计算所需内容的属性

    下面是我的建议(该类的集合将替换Disc类中的MeasuredRadii和MeasurementValue)。只是一个建议

    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; } }
    
    }
    
    公共类度量
    {
    私人双测量半径=0.0;
    公共双MeasuredRadius{get{return MeasuredRadius;}set{MeasuredRadius=value;}
    公共双重测量厚度
    {
    收到
    {
    var measurementValuesWithCurrentRadius=测量值。其中(x=>x.Position.x==MeasuredRadius);
    var measuredDistances=测量值SwithCurrentRadius。选择(x=>(传感器之间的距离-x.DistanceFromSensor1-x.DistanceFromSensor2));
    返回测量的距离。平均值();
    }
    }
    私人可观察收集测量值;
    公共ObservableCollection MeasurementValues{get{return MeasurementValues;}}
    }