2014-05-09 24 views
0

情況:總的來說:我有一張光盤並且要測量厚度。測量系統是兩個彼此具有確定距離的傳感器。光盤放置在這些傳感器之間,然後測量它們到光盤的距離。自定義評估數據網格中的列以及將可觀察集合綁定到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 ...

具體問題

  1. 如何將disc.MeasuredRadii綁定到DataGrid的第一列?
  2. 如何使用給定的函數計算其他列?

重要:我不希望更多的會員加入到Disc類。因爲它已經包含了所有的相關數據。我想在表中做更多的靜態數據,而且我不想爲所有這些靜態數據創建一個字段,因爲:如果我不想顯示所有這些靜態數據,該怎麼辦?然後,我必須改變視圖中的模型。這是對我個人的規則...

編輯:我來自的WinForms,我想我可以使用類似的CellFormating事件對我整潔的小方法綁定到DataGrid。 DataGrids中有類似的東西嗎?

回答

0

首先,您的綁定不起作用,因爲您綁定了一個雙精度集合,因此您沒有屬性名稱。你還沒有爲你的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; } } 

}