情況:總的來說:我有一張光盤並且要測量厚度。測量系統是兩個彼此具有確定距離的傳感器。光盤放置在這些傳感器之間,然後測量它們到光盤的距離。自定義評估數據網格中的列以及將可觀察集合綁定到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
一般問題:我怎樣才能做到這一點?
我做了什麼:我創建了一個類namend 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
的角度phi。
爲了實現這個表,我嘗試在我的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中有類似的東西嗎?