如何使用不知道何时添加项目的ItemsSource更新Datagrid?

时间:2015-05-12 20:22:15

标签: c# wpf data-binding datagrid

我知道如果我想通知网格应该更新项目中的属性,我应该实现INotifyPropertyChanged接口,所以我做了,之前它正在工作。

我决定更改绑定ObservableCollection的getter,以便它相对于我的DataController类。这样,Add()方法永远不会被调用,因此理论上永远不会调用NotifyCollectionChangedEventHandler。听起来不错吗?

这是网格:

Bound grid

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;
        }
    }
}

一定是我忽视的简单事物。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

您不应该将UI绑定到视图模型中始终提供新值的属性。这就是您的原始版本的原因。在可观察集合中添加和删除项目应该在实现INotifyCollectionChanged时更新UI。因此,保留一个可观察的集合,将其绑定到UI,以及何时需要清除它并替换项目。