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

问题描述 投票:0回答:1

我正在使用obzableDictionary的this实现。

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

我的XAML:

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

我的ViewModel在哪里更新了Dictionary。

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但我希望它看起来像this

编辑

GradeRaitings的内容:

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,而是使用List,如:

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一起使用的解决方案。

c# wpf mvvm wpfdatagrid
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.