我知道如果我想通知网格应该更新项目中的属性,我应该实现INotifyPropertyChanged
接口,所以我做了,之前它正在工作。
我决定更改绑定ObservableCollection
的getter,以便它相对于我的DataController类。这样,Add()
方法永远不会被调用,因此理论上永远不会调用NotifyCollectionChangedEventHandler
。听起来不错吗?
这是网格:
De grid绑定到驻留在ViewModel
中的TeamQualificationMatches集合:
public ObservableCollection<TeamMatchModel> TeamQualificationMatches
{
get
{
return new ObservableCollection<TeamMatchModel>(App.Data.GetDoubleTeamMatches().Where(
match => match.TournamentId == CurrentTournament.Id &&
match.Status == MatchStatus.QualificationsPlaying).ToList<TeamMatchModel>());
}
}
大多数TeamMatchModel
个实例都会实现OnPropertyChanged
:
public string Notes
{
get { return _teamMatch.Notes; }
set
{
_teamMatch.Notes = value;
OnPropertyChanged("Notes");
}
}
当我的TeamQualificationMatches
如下时,我的逻辑曾经工作过:
private ObservableCollection<TeamMatchModel> _teamQualificationMatches = new ObservableCollection<TeamMatchModel>();
public ObservableCollection<TeamMatchModel> TeamQualificationMatches
{
get
{
return _teamQualificationMatches;
}
}
当我更改TeamMatchModel
个实例的状态时,我会拨打OnPropertyChanged("TeamQualificationMatches")
。所以我不知道为什么网格没有反映这次更新。
public MatchStatus Status
{
get { return (MatchStatus)_teamMatch.Status; }
set
{
_teamMatch.Status = (int)value;
OnPropertyChanged("Status");
switch (value)
{
case MatchStatus.QualificationsPlaying:
OnPropertyChanged("TeamQualificationMatches");
break;
case MatchStatus.PreselectionsPlaying:
OnPropertyChanged("TeamPreSelectionMatches");
break;
case MatchStatus.RoundAPlaying:
OnPropertyChanged("TeamWinnerMatches");
break;
case MatchStatus.RoundBPlaying:
OnPropertyChanged("TeamLoserMatches");
break;
}
}
}
一定是我忽视的简单事物。任何帮助表示赞赏。
答案 0 :(得分:1)
您不应该将UI绑定到视图模型中始终提供新值的属性。这就是您的原始版本的原因。在可观察集合中添加和删除项目应该在实现INotifyCollectionChanged时更新UI。因此,保留一个可观察的集合,将其绑定到UI,以及何时需要清除它并替换项目。