Обновление значений словаря добавляет строки в DataGrid WPF - PullRequest
0 голосов
/ 05 марта 2019

Я использую эту реализацию ObservableDictionary.

Когда я обновляю значения до определенного ключа, тогда мой словарь обновляется правильно , но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]++;
    }
}

Послепри выполнении кода мой вид выглядит как это , но я ожидаю, что он выглядит как это

РЕДАКТИРОВАТЬ

Содержимое 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 я использую список вроде:

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

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

с номерами сортировки, такими как:

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.

1 Ответ

0 голосов
/ 07 марта 2019

Нашел ответ и поместил его в правку в вопросе.

...