【发布时间】:2019-03-05 07:55:45
【问题描述】:
我正在使用 ObservableDictionary 的 this 实现。
当我将值更新为特定键时,我的字典就会更新 correctly 但绑定到 Dictionary 的 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,但我希望它看起来像 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,而是使用如下列表:
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 一起使用的解决方案。
【问题讨论】:
-
@mm8:仅仅因为你的“答案”完全不相关和错误,你就删除了你的帖子并对我的问题投了反对票?真的很棒...
标签: c# wpf mvvm wpfdatagrid