gpt4 book ai didi

c# - 错误: This type of CollectionView does not support changes to its SourceCollection

转载 作者:行者123 更新时间:2023-12-01 16:22:17 28 4
gpt4 key购买 nike

我有一个 ObservableCollection 项目,我需要能够更新它并仍然使用 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;
}

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

An unhandled exception of type 'System.NotSupportedException' occurred in PresentationFramework.dll

Additional information: This type of CollectionView does not support changes to its SourceCollection from a thread different from the Dispatcher thread.

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 作为过滤列表并过滤它,但它仍然给我一个错误。我尝试过使用其他人发布的从 Google 第一页获取的 MTObservableCollection 和 AsyncObservableCollection,但它们也在其他方面造成了困惑。

我该如何解决这个问题?我需要能够进行过滤,我需要它们的集合,并且当源发生更改时,我需要立即在应用程序中查看这些更改。

最佳答案

您是否尝试过包装所有将过滤器设置为调用 WPF 调度程序的代码?

通常,如果在与 UI 线程不同的线程的代码中修改了绑定(bind)到 View 的集合,则必须执行此操作。

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

关于c# - 错误: This type of CollectionView does not support changes to its SourceCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33808346/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com