如何使用不知道何时添加项目的 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 ,当你需要清除它并替换项目时。