如何使用不知道何时添加项目的 ItemsSource 更新 Datagrid?
How to update Datagrid with an ItemsSource that doesn't know when an item is added?
我知道我应该实现 INotifyPropertyChanged
接口,如果我想通知网格它应该更新项目中的属性,所以我做到了并且它之前工作。
我决定更改绑定 ObservableCollection
的 getter,以便它相对于我的 DataController class。这样,理论上永远不会调用 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;
}
}
}
这一定是我忽略的简单问题。感谢任何帮助。
您不应将 UI 绑定到始终提供新值的视图模型中的 属性。这就是您的原始版本有效的原因。在可观察集合中添加和删除项目应该更新 UI,因为它实现了 INotifyCollectionChanged。所以保留一个单独的可观察集合,将它绑定到 UI ,当你需要清除它并替换项目时。
我知道我应该实现 INotifyPropertyChanged
接口,如果我想通知网格它应该更新项目中的属性,所以我做到了并且它之前工作。
我决定更改绑定 ObservableCollection
的 getter,以便它相对于我的 DataController class。这样,理论上永远不会调用 Add()
方法,永远不会调用 NotifyCollectionChangedEventHandler
方法。听起来对吗?
这是网格:
De grid 绑定到我位于 ViewModel
:
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;
}
}
}
这一定是我忽略的简单问题。感谢任何帮助。
您不应将 UI 绑定到始终提供新值的视图模型中的 属性。这就是您的原始版本有效的原因。在可观察集合中添加和删除项目应该更新 UI,因为它实现了 INotifyCollectionChanged。所以保留一个单独的可观察集合,将它绑定到 UI ,当你需要清除它并替换项目时。