更新字典值将行添加到 DataGrid WPF

Updating Dictionary Values adds Rows to DataGrid WPF

我正在使用 this ObservableDictionary 的实现。

当我将值更新为特定键时,我的词典也会更新 correctly 但绑定到字典的 DataGrid 有更多行。

我的XAML:

<DataGrid ItemsSource="{Binding GradeNumbers}"
            AutoGenerateColumns="False">
      <DataGrid.Columns>                    
          <DataGridTextColumn Header="Amount" Binding="{Binding Value}" IsReadOnly="True"/>
      </DataGrid.Columns>
</DataGrid>

还有我更新字典的 ViewModel。

public ObservableDictionary<double, int> GradeNumbers { get; set; }

private void GetGradeNumbers()
{
    foreach (var gradeRating in this.gradeRatings)
    {
      this.gradeNumbers.Add(gradeRating.Grade, 0);
    }

    foreach (var grading in this.gradings)
    {
       this.gradeNumbers[grading.Grade]++;
    }
}

执行代码后,我的视图看起来像 this but I would expect it looks like this

编辑

评分内容:

public List<GradeRatingDTO> GradeRatings
    {
        get
        {
            return this.gradeRatings;
        }

        set
        {
            this.gradeRatings = value;
            this.OnPropertyChanged(nameof(this.GradeRatings));
        }
    }
public class GradeRatingDTO
    {
        /// <summary>
        /// Gets or sets the Grade.
        /// </summary>
        public double Grade { get; set; }

        /// <summary>
        /// Gets or sets the LowerBoundary of the Grade.
        /// </summary>
        public double LowerBoundary { get; set; }

        /// <summary>
        /// Gets or sets the UpperBoundary of the Grade.
        /// </summary>
        public double UpperBoundary { get; set; }
    }

和评分:

private List<GradingModel> gradings;

public class GradingModel : ViewModelBase
    {
        private double grade;
        private double totalScore;

        /// <summary>
        /// Gets or sets the MatriculationNumber.
        /// </summary>
        public string MatriculationNumber { get; set; }

        /// <summary>
        /// Gets or sets the PointsPerProblems.
        /// </summary>
        public ObservableCollection<DoubleItem> PointsPerProblems { get; set; }

        /// <summary>
        /// Gets or sets the Grade.
        /// </summary>
        public double Grade
        {
            get
            {
                return this.grade;
            }

            set
            {
                this.grade = value;
                this.OnPropertyChanged(nameof(this.Grade));
            }
        }

        /// <summary>
        /// Gets or sets the TotalScore.
        /// </summary>
        public double TotalScore
        {
            get
            {
                return this.totalScore;
            }

            set
            {
                this.totalScore = value;
                this.OnPropertyChanged(nameof(this.TotalScore));
            }
        }

编辑 2

找到解决方案或解决方法...

我没有使用 ObservableDictionary,而是使用如下列表:

public List<GradingNumbers> GradeNumbersList
{
  get
  {
    return this.gradeNumbersList;
  }

  set
  {
    this.gradeNumbersList = value;
    this.OnPropertyChanged(nameof(this.GradeNumbersList));
  }
 }

GradingNumbers 如:

public class GradingNumbers
{
   public double Grade { get; set; }

   public int Amount { get; set; }
}

添加值:

private void GetGradeNumbers()
{
  List<GradingNumbers> tmpGradingNumbers = new List<GradingNumbers>();

   foreach (var gradeRating in this.gradeRatings)
   {
     tmpGradingNumbers.Add(new GradingNumbers() { Grade = gradeRating.Grade, Amount = 0 });
    }

    foreach (var grading in this.gradings)
    {
      tmpGradingNumbers.First(g => g.Grade == grading.Grade).Amount++;
    }

    this.GradeNumbersList = tmpGradingNumbers;
 }

和 XAML:

<DataGrid ItemsSource="{Binding GradeNumbersList}"
                      AutoGenerateColumns="False">
      <DataGrid.Columns>
         <DataGridTextColumn Header="Amount" Binding="{Binding Amount}" IsReadOnly="True"/>
      </DataGrid.Columns>
 </DataGrid>

我已经将这种方法用于另一个视图并且效果很好,但我认为使用 ObservableDictionary 会更优雅...

我仍然对使用 ObservableDictionary 的解决方案感兴趣。

找到答案并将其放入问题的编辑中。