从数据库表创建的ObservableCollection不更新

时间:2015-09-05 10:10:48

标签: c# .net events observablecollection

在我的数据库助手类中,我设置连接,创建Table和ObservableCollection对象并处理所有数据库操作:

public class ProfilesSourceSQLite : IProfilesSource
{
    private Table<ProfileManager.Profile> Profiles;
    private ObservableCollection<ProfileManager.Profile> profilesCollection;

    public ProfilesSourceSQLite()
    {
        ...
        Profiles = dbContext.GetTable<ProfileManager.Profile>();
        profilesCollection = new ObservableCollection<ProfileManager.Profile>(Profiles);
    }

    public ObservableCollection<ProfileManager.Profile> GetProfilesCollection()
    {
        return profilesCollection;
    }

    public bool AddProfile(ProfileManager.Profile profile)
    {
        try
        {
            Profiles.InsertOnSubmit(profile);
            dbContext.SubmitChanges();
        }
        ...
    }
}

我的问题是永远不会触发CollectionChanged profilesCollection事件。

public class ProfileManager
{
    private static ProfileManager instance;
    public static ProfileManager Instance
    {
        get
        {
            if (instance == null)
                instance = new ProfileManager();

            return instance;
        }
    }

    private ProfileManager()
    {
        ...
        profiles = new ProfilesSourceSQLite();
        profiles.GetProfilesCollection().CollectionChanged += ProfileManager_CollectionChanged;
    }

    private void ProfileManager_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        // MessageBox never appears
        MessageBox.Show("CHANGED!");
    }

    public bool AddProfile(Profile profile)
    {
        return profiles.AddProfile(profile);
    }
}

// Somewhere in the UI class
private void btnClicked()
{
    ProfileManager.Instance.AddProfile(newProfile);
}

我想让profilesCollection成为ItemsSource的{​​{1}},所以我不必关心处理项目列表更改,但它也不能用作这个更简单的示例。我究竟做错了什么?或者有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

通过向数据库添加ObservableCollection<ProfileManager.Profile>将自动更新,您所犯的错误。它不会。

当您致电new ObservableCollection<ProfileManager.Profile>(Profiles);时,它会在数据库中创建配置文件的快照。它不会创建任何指向数据库的链接,因此未来的数据库更新不会复制到集合中。

因此代码Profiles.InsertOnSubmit(profile); dbContext.SubmitChanges();不会更新集合。因此,它不会引发这一事件。

答案 1 :(得分:0)

您正在更改集合中的项目,而不是集合本身 您需要ProfileManager.Profile实施INotifyPropertyChanged来满足您的要求。

祝你好运。