这可能听起来像是一个琐碎的问题,但我在网上找不到任何有效的解决方案。我正在使用PRISM
框架,我已经快要放弃了它。原因如下:
我有一个相当好用的ObservableCollection
,只要给它分配一个列表并将其遗忘即可正常工作。但这不是ObservableCollection
的目标,对吧?它应该具有变化的能力...所以,这就是集合:
<DataGrid ItemsSource="{Binding Items, Mode=TwoWay}" AutoGenerateColumns="True" />
private ObservableCollection<Item> _items = new ObservableCollection<Item>();
public ObservableCollection<Item> Items
{
get { return _items; }
set { SetProperty(ref _items, value); }
}
所以,开始了:
Items = InitializeItems(); // Works great!
Items.Add(new Item() { ItemId = 1 }); // Also works
但是然后...
for (int i = 1; i < 10; i++)
{
Items.Add(new Item() { ItemId = i });
}
失败.. 有时会出现异常:
未处理的类型为 'System.InvalidOperationException' 的异常在 PresentationFramework.dll 中发生,附加信息:ItemsControl 与其项源不一致。
AddRange()
?忘了吧..
所有操作都在单独的线程中完成:
Task.Factory.StartNew(() =>
{
Items = InitializeItems(); // Works great!
Items.Add(new Item() { ItemId = 1 }); // Also works
for (int i = 1; i < 10; i++)
{
Items.Add(new Item() { ItemId = i });
}
});
我甚至创建了扩展方法:
public static class ObservableCollectionExtensions
{
public static void AddRange<T>(this ObservableCollection<T> data, List<T> range)
{
if (range == null) throw new ArgumentNullException("range");
foreach (var i in range) data.Add(i);
// How can I force ObservableCollection to update?!
}
}
嗯...我做错了什么?我在更改ObservableCollection
。所以,每次我想添加新项时,我都必须从旧的和新的中创建一个新集合,并将其分配给ObservableCollection吗?因为只有赋值运算符对我有效 :(
谢谢任何帮助!
ItemId
的重复值为1
会导致与ObservableCollection
无关的问题吗? - Cory NelsonObservableCollection
属性时,它应该始终仅在UI线程中更新。否则会出现STA线程
错误。 - Nikhil AgrawalItems =
操作,因为频繁替换整个集合会使集合的作用失去意义。如果您永远不会向现有集合添加或删除项目,并且总是替换它,则最好只使用List<T>
并将其填充并分配给Items,以便它被捕获。 - Scott Chamberlain