- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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/
我有一个包含两个 ICollectionView 的 ViewModel s 绑定(bind)为 ItemsSource s 到两个不同的 ListBox es。两者包装相同 ObservableCo
删除绑定(bind)集合中的所有项目后,datagrid.items.count为1,项目集合中唯一的项目是newitemplaceholder,但datagrid不显示newitemplacehol
所以我正在开发一个带有在应用程序(主应用程序)中使用的 UI 的插件。为了在主应用程序工作时使我的 UI 响应,我在其单独的线程中启动我的 UI,如下所示: public void Show
我有一个 ObservableCollection 项目,我需要能够更新它并仍然使用 ICollectionView 来表示数据。 以下是相关代码: private ObservableCollect
这个问题在这里已经有了答案: How do I update an ObservableCollection via a worker thread? (7 个答案) 关闭 2 年前。 我有一个 D
在 Visual Studio 2017 中,尝试存档 Xamarin Android 项目时,成功构建后出现以下错误: 无法创建应用程序存档“MyArchive”。这种类型的 CollectionV
这是我在尝试存档我的应用程序以进行部署时遇到的错误。 此错误不会在任何其他时间出现。该项目在模拟器和设备上构建和运行没有问题。该错误的上下文或方向为零,不知道在哪里可以修复它。它也只是随机出现,上
我是一名优秀的程序员,十分优秀!