更新字典值将行添加到 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 的解决方案感兴趣。
找到答案并将其放入问题的编辑中。
我正在使用 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 的解决方案感兴趣。
找到答案并将其放入问题的编辑中。