[英]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.