對ObservableCollection進行排序的問題在於,每次更改集合時,都會觸發事件。所以對於一種從一個位置移除物品並將它們添加到另一個位置的行爲,最終會發生大量事件。
我認爲你最好打賭就是隻要按正確的順序插入ObservableCollection開始。從集合中刪除項目不會影響訂購。我颳起了快速的擴展方法來說明
public static void InsertSorted<T>(this ObservableCollection<T> collection, T item, Comparison<T> comparison)
{
if (collection.Count == 0)
collection.Add(item);
else
{
bool last = true;
for (int i = 0; i < collection.Count; i++)
{
int result = comparison.Invoke(collection[i], item);
if (result >= 1)
{
collection.Insert(i, item);
last = false;
break;
}
}
if (last)
collection.Add(item);
}
}
所以,如果你使用的字符串(例如),代碼看起來像這樣
ObservableCollection<string> strs = new ObservableCollection<string>();
Comparison<string> comparison = new Comparison<string>((s1, s2) => { return String.Compare(s1, s2); });
strs.InsertSorted("Mark", comparison);
strs.InsertSorted("Tim", comparison);
strs.InsertSorted("Joe", comparison);
strs.InsertSorted("Al", comparison);
編輯
你可以如果擴展ObservableCollection並提供您自己的插入/添加方法,請保持呼叫相同。類似這樣的:
public class BarDataCollection : ObservableCollection<BarData>
{
private Comparison<BarData> _comparison = new Comparison<BarData>((bd1, bd2) => { return DateTime.Compare(bd1.StartDate, bd2.StartDate); });
public new void Insert(int index, BarData item)
{
InternalInsert(item);
}
protected override void InsertItem(int index, BarData item)
{
InternalInsert(item);
}
public new void Add(BarData item)
{
InternalInsert(item);
}
private void InternalInsert(BarData item)
{
if (Items.Count == 0)
Items.Add(item);
else
{
bool last = true;
for (int i = 0; i < Items.Count; i++)
{
int result = _comparison.Invoke(Items[i], item);
if (result >= 1)
{
Items.Insert(i, item);
last = false;
break;
}
}
if (last)
Items.Add(item);
}
}
}
插入索引被忽略。
BarData db1 = new BarData(DateTime.Now.AddDays(-1));
BarData db2 = new BarData(DateTime.Now.AddDays(-2));
BarData db3 = new BarData(DateTime.Now.AddDays(1));
BarData db4 = new BarData(DateTime.Now);
BarDataCollection bdc = new BarDataCollection();
bdc.Add(db1);
bdc.Insert(100, db2);
bdc.Insert(1, db3);
bdc.Add(db4);
這是一次性任務,即在收集綁定到控件之前可以完成的任務嗎? –
集合即使在綁定時也會保持更改(這就是我使用ObservableCollection的原因,以便在集合更改時更新UI)。解決這個問題的一個選擇是在向收藏中添加項目時處理它,以確保按照排序順序將其插入到適當的索引中,或者第二個選項是在添加或刪除項目時對收集進行排序。我想在這裏評估第二個選項。 –
在我看來,這是一個設計缺陷,對象本身知道到現在爲止花了多少錢,而且這些信息取決於排序。這應該是用戶控件中的一個功能('ShowTotal = true')。 –