这听起来似乎是一个简单的问题,但我找不到任何在线工作。我正在使用PRISM
,在我离开之前我就走了一步,永远不会回到这个框架。这里的原因:如何添加项目到ObservableCollection?
我很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?!
}
}
EHH ..我在做什么错算了吧..
一切都在独立线程中完成的?我正在更换ObservableCollection
。所以,每次我想添加新的项目时,我都必须从旧的和新的创建新的集合并分配给ObservableCollection?因为只有赋值运算符为我工作:(
感谢您的帮助!
是否有可能有一个重复的'ItemId'为'1'导致与ObservableCollection无关的问题? –
当ObservableCollection' propery在View中绑定时,它应该总是只在UI Thread中更新。否则它会给STA线程错误。 –
在WPF中,PropertyChanged事件会自动封送到UI线程,但INotifyCollectionChanged不是这种情况。如果你想修改ObservableCollection,你必须确保你的修改是在UI线程上完成的,否则会有异常。 –