[英]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 ...
具体问题 :
disc.MeasuredRadii
绑定到DataGrid的第一列? 重要提示 :我不想向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.