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