這聽起來似乎是一個簡單的問題,但我找不到任何在線工作。我正在使用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線程上完成的,否則會有異常。 –