簡體   English   中英

對數據網格中的列進行自定義評估,並將Observable Collection綁定到DataGrid的列

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

具體問題

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

重要提示 :我不想向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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM