错误:此类型的CollectionView不支持更改其SourceCollection [英] Error: This type of CollectionView does not support changes to its SourceCollection

查看:0
本文介绍了错误:此类型的CollectionView不支持更改其SourceCollection的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个ObservableCollection of Items,我需要能够更新它,并且仍然使用ICollectionView显示数据。

以下是相关代码:

private ObservableCollection<Hero> heroesDBHeroes;
public ObservableCollection<Hero> HeroesDBHeroes
{
    get
    {
        return heroesDBHeroes;
    }
    set
    {
        heroesDBHeroes = value;
        OnPropertyChanged("HeroesDBHeroes");
    }
}
private void HeroesDBAddHeroes()
{
    if(HeroesDBHeroes != null)
    {
        HeroesDBHeroes.Clear();
    }
    HeroesDBHeroes = Hero.GetAllHeroes();

    HeroesDBFilteredHeroes = new ListCollectionView(HeroesDBHeroes);
    HeroesDBFilteredHeroes.Filter = new Predicate<object>(HeroesDBFilterHeroes);
    HeroesDBFilteredHeroes.Refresh();
    OnPropertyChanged("HeroesDBFilteredHeroes");
}

下面是CollectionView及其筛选器:

    public CollectionView HeroesDBFilteredHeroes { get; set; }
    public bool HeroesDBFilterHeroes(object item)
    {
        Hero h = item as Hero;
        bool ID, Name, GoldMinimum, GoldMaximum, PlatinumMinimum, PlatinumMaximum, DBTag, ReleaseDateStart, ReleaseDateEnd, Available, Sale, Featured, New, F2P, Homepage, Thumbnail, FeaturedThumbnail, ShortDescription, Description;

        ID = Name = GoldMinimum = GoldMaximum = PlatinumMinimum = PlatinumMaximum = DBTag = ReleaseDateStart = ReleaseDateEnd = Available = Sale = Featured = New = F2P = Homepage = Thumbnail = FeaturedThumbnail = ShortDescription = Description = false;

        if (h == null)
        {
            return false;
        }

        if (HeroesDBFilterID == null || HeroesDBFilterID == h.ID)
        {
            ID = true;
        }

        if (HeroesDBFilterName == "" || h.Name.IndexOf(HeroesDBFilterName, 0, StringComparison.CurrentCultureIgnoreCase) != -1)
        {
            Name = true;
        }

        if (HeroesDBFilterGoldMinimum == null || HeroesDBFilterGoldMinimum <= h.Gold)
        {
            GoldMinimum = true;
        }

        if (HeroesDBFilterGoldMaximum == null || HeroesDBFilterGoldMaximum >= h.Gold)
        {
            GoldMaximum = true;
        }

        if (HeroesDBFilterPlatinumMinimum == null || HeroesDBFilterPlatinumMinimum <= h.Platinum)
        {
            PlatinumMinimum = true;
        }

        if (HeroesDBFilterPlatinumMaximum == null || HeroesDBFilterPlatinumMaximum >= h.Platinum)
        {
            PlatinumMaximum = true;
        }

        if (HeroesDBFilterDBTag == "" || h.DBTag.IndexOf(HeroesDBFilterDBTag, 0, StringComparison.CurrentCultureIgnoreCase) != -1)
        {
            DBTag = true;
        }

        if (HeroesDBFilterReleaseDateStart == null || HeroesDBFilterReleaseDateStart <= h.ReleaseDate)
        {
            ReleaseDateStart = true;
        }

        if (HeroesDBFilterReleaseDateEnd == null || HeroesDBFilterReleaseDateEnd >= h.ReleaseDate)
        {
            ReleaseDateEnd = true;
        }

        switch(HeroesDBFilterAvailable)
        {
            case 0:
                Available = true;
                break;
            case 1:
                if(h.Available == true)
                {
                    Available = true;
                }
                break;
            case 2:
                if (h.Available == false)
                {
                    Available = true;
                }
                break;
        }

        switch (HeroesDBFilterSale)
        {
            case 0:
                Sale = true;
                break;
            case 1:
                if (h.Sale == true)
                {
                    Sale = true;
                }
                break;
            case 2:
                if (h.Sale == false)
                {
                    Sale = true;
                }
                break;
        }

        switch (HeroesDBFilterFeatured)
        {
            case 0:
                Featured = true;
                break;
            case 1:
                if (h.Featured == true)
                {
                    Featured = true;
                }
                break;
            case 2:
                if (h.Featured == false)
                {
                    Featured = true;
                }
                break;
        }

        switch (HeroesDBFilterNew)
        {
            case 0:
                New = true;
                break;
            case 1:
                if (h.NewTag == true)
                {
                    New = true;
                }
                break;
            case 2:
                if (h.NewTag == false)
                {
                    New = true;
                }
                break;
        }

        switch (HeroesDBFilterF2P)
        {
            case 0:
                F2P = true;
                break;
            case 1:
                if (h.F2P == true)
                {
                    F2P = true;
                }
                break;
            case 2:
                if (h.F2P == false)
                {
                    F2P = true;
                }
                break;
        }

        switch (HeroesDBFilterHomepage)
        {
            case 0:
                Homepage = true;
                break;
            case 1:
                if (h.Homepage == true)
                {
                    Homepage = true;
                }
                break;
            case 2:
                if (h.Homepage == false)
                {
                    Homepage = true;
                }
                break;
        }

        switch (HeroesDBFilterThumbnail)
        {
            case 0:
                Thumbnail = true;
                break;
            case 1:
                if (h.ThumbnailImage.Count<byte>() >= 5)
                {
                    Thumbnail = true;
                }
                break;
            case 2:
                if (h.ThumbnailImage.Count<byte>() < 5)
                {
                    Thumbnail = true;
                }
                break;
        }

        switch (HeroesDBFilterFeaturedThumbnail)
        {
            case 0:
                FeaturedThumbnail = true;
                break;
            case 1:
                if (h.FeaturedThumbnailImage.Count<byte>() >= 5)
                {
                    FeaturedThumbnail = true;
                }
                break;
            case 2:
                if (h.FeaturedThumbnailImage.Count<byte>() < 5)
                {
                    FeaturedThumbnail = true;
                }
                break;
        }

        if (HeroesDBFilterShortDescription == "" || h.ShortDescription.IndexOf(HeroesDBFilterShortDescription, 0, StringComparison.CurrentCultureIgnoreCase) != -1)
        {
            ShortDescription = true;
        }

        if (HeroesDBFilterDescription == "" || h.Description.IndexOf(HeroesDBFilterDescription, 0, StringComparison.CurrentCultureIgnoreCase) != -1)
        {
            Description = true;
        }

        return ID && Name && GoldMinimum && GoldMaximum && PlatinumMinimum && PlatinumMaximum && DBTag && ReleaseDateStart && ReleaseDateEnd && Available && Sale && Featured && New && F2P && Homepage && Thumbnail && FeaturedThumbnail && ShortDescription && Description;
    }

我在以下代码片段中遇到以下错误:

发生了类型为‘System.NotSupducdException’的未经处理的异常 在PresentationFramework.dll中

其他信息:此类型的CollectionView不支持 从不同于的线程更改其SourceCollection 调度程序线程。

private ICommand heroesDBAddEntry;
public ICommand HeroesDBAddEntry
{
    get
    {
        if (heroesDBAddEntry == null)
        {
            heroesDBAddEntry = new RelayCommand(HeroesDBAddEntryEx, null);
        }
        return heroesDBAddEntry;
    }
}
private void HeroesDBAddEntryEx(object p)
{
    if (HeroesDBUpdateID != null)
    {
        HeroesDBUpdateEntryEx();
        return;
    }

    int x;
    var db = new SQLiteDatabase();

    string query, changesQuery;

    query = "INSERT INTO Heroes (Name,Description,ShortDescription,Gold,Platinum,DBTag,ReleaseDate,Available,Sale,Featured,NewTag,F2P,Homepage,ThumbnailImage,ThumbnailImageName," +
        "FeaturedThumbnailImage,FeaturedThumbnailImageName) ";

    query += "VALUES ('" + HeroesDBName.Replace("'", "''") + "','" + HeroesDBDescription.Replace("'", "''") + "','" + HeroesDBShortDescription.Replace("'", "''") + "'," +
        HeroesDBGold + "," + HeroesDBPlatinum + ",'" + HeroesDBDBTag.Replace("'", "''") + "','" + HeroesDBReleaseDate.Date.ToString("yyyy-MM-dd") + "'," +
        Convert.ToInt32(HeroesDBAvailable) + "," + Convert.ToInt32(HeroesDBSale) + "," + Convert.ToInt32(HeroesDBFeatured) + "," + Convert.ToInt32(HeroesDBNewTag) + "," +
        Convert.ToInt32(HeroesDBF2P) + "," + Convert.ToInt32(HeroesDBHomepage) + ",'" + Convert.ToBase64String(HeroesDBThumbnailImage) + "','" +
        HeroesDBThumbnailPath.Replace("'", "''") + "','" + Convert.ToBase64String(HeroesDBFeaturedThumbnailImage) + "','" + HeroesDBFeaturedThumbnailPath.Replace("'", "''") + "'); ";

    changesQuery = "INSERT INTO Heroes_Changes (HeroID,Action,TimeStamp,User,Name,Description,ShortDescription,Gold,Platinum,DBTag,ReleaseDate,Available,Sale,Featured,NewTag,F2P," +
        "Homepage,ThumbnailImage,ThumbnailImageName,FeaturedThumbnailImage,FeaturedThumbnailImageName) ";

    changesQuery += "VALUES (" + HeroesDBNextID + ",'" + "INSERT" + "','" + DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss") + "','" + Environment.UserName + "','" +
        HeroesDBName.Replace("'", "''") + "','" + HeroesDBDescription.Replace("'", "''") + "','" + HeroesDBShortDescription.Replace("'", "''") + "'," +
        HeroesDBGold + "," + HeroesDBPlatinum + ",'" + HeroesDBDBTag.Replace("'", "''") + "','" + HeroesDBReleaseDate.Date.ToString("yyyy-MM-dd") + "'," +
        Convert.ToInt32(HeroesDBAvailable) + "," + Convert.ToInt32(HeroesDBSale) + "," + Convert.ToInt32(HeroesDBFeatured) + "," + Convert.ToInt32(HeroesDBNewTag) + "," +
        Convert.ToInt32(HeroesDBF2P) + "," + Convert.ToInt32(HeroesDBHomepage) + ",'" + Convert.ToBase64String(HeroesDBThumbnailImage) + "','" +
        HeroesDBThumbnailPath.Replace("'", "''") + "','" + Convert.ToBase64String(HeroesDBFeaturedThumbnailImage) + "','" + HeroesDBFeaturedThumbnailPath.Replace("'", "''") + "'); ";

    try
    {
        x = db.ExecuteNonQuery(query);
        HeroesDBStatus = x + " Record(s) Added.";
        x = db.ExecuteNonQuery(changesQuery);
    }
    catch(Exception err)
    {
        System.Windows.Forms.MessageBox.Show(err.Message);
    }

    HeroesDBHeroes.Add(new Hero(
        HID: HeroesDBNextID,
        HName: HeroesDBName,
        HDescription: HeroesDBDescription,
        HShortDescription: HeroesDBShortDescription,
        HGold: HeroesDBGold,
        HPlatinum: HeroesDBPlatinum,
        HDBTag: HeroesDBDBTag,
        HReleaseDate: HeroesDBReleaseDate,
        HAvailable: HeroesDBAvailable,
        HSale: HeroesDBSale,
        HFeatured: HeroesDBFeatured,
        HNewTag: HeroesDBNewTag,
        HF2P: HeroesDBF2P,
        HHomepage: HeroesDBHomepage,
        HThumbnailImage: HeroesDBThumbnailImage,
        HThumbnailImageName: HeroesDBThumbnailPath,
        HFeaturedThumbnailImage: HeroesDBFeaturedThumbnailImage,
        HFeaturedThumbnailImageName: HeroesDBFeaturedThumbnailPath,
        HForce: true
        ));
    HeroesDBNextID++;

    HeroesDBName = "";
    HeroesDBDescription = "";
    HeroesDBShortDescription = "";
    HeroesDBGold = 0;
    HeroesDBPlatinum = 0;
    HeroesDBDBTag = "";
    HeroesDBReleaseDate = DateTime.Today;
    HeroesDBAvailable = false;
    HeroesDBSale = false;
    HeroesDBFeatured = false;
    HeroesDBNewTag = false;
    HeroesDBF2P = false;
    HeroesDBHomepage = false;
    HeroesDBThumbnailImage = new byte[] { 0x00 };
    HeroesDBThumbnailPath = "";
    HeroesDBFeaturedThumbnailImage = new byte[] { 0x00 };
    HeroesDBFeaturedThumbnailPath = "";
    HeroesDBUpdateID = null;
}

错误发生在我有HeroesDB.Add(...)行,紧跟在Try Catch之后。

我试了很多方法,但都不管用。

我尝试使用另一个ObservableCollection作为过滤列表并对其进行过滤,但它仍然给我一个错误。我试过使用取自谷歌首页的MTObservableCollection和AsyncObservableCollection,但它们在其他方面也搞砸了。

我该如何着手解决这个问题?我需要能够过滤,我需要它们的集合,当源代码更改时,我需要立即在应用程序中看到这些更改。

WPF

您是否已尝试包装设置对推荐答案调度程序调用的筛选器的所有代码?

通常,如果在不同于UI线程的线程的代码中修改绑定到视图的集合,则必须执行此操作。

Application.Current.Dispatcher.BeginInvoke(
  DispatcherPriority.Background,
  new Action(() => { 
    HeroesDBAddHeroes();
  }));

这篇关于错误:此类型的CollectionView不支持更改其SourceCollection的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆