Lý do mà không có ObservableKeyedCollection (hoặc bất kỳ loại khác như vậy mà chỉ đơn thuần là một sự kết hợp của các loại generic khác) là vì ObservableCollection là chung chung, và làm cho việc thực hiện một "ObservableKeyedCollection" dễ dàng như này:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
public class DictionaryWatcher : ObservableCollection<KeyValuePair<string, object>>, IDisposable
{
private NotifyCollectionChangedEventHandler watcher;
private bool watching = false;
public DictionaryWatcher()
{
watcher = new NotifyCollectionChangedEventHandler(ReportChange);
CollectionChanged += watcher;
Watched = true;
}
public bool Watched
{
get
{
return watching;
}
set
{
if (watching)
{
lock (this)
{
CollectionChanged -= watcher;
watching = false;
}
}
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
public void Initialize()
{
this.Add(new KeyValuePair<string, object>("First", 1));
this.Add(new KeyValuePair<string, object>("Second", 2));
this.Add(new KeyValuePair<string, object>("Turd", 3));
KeyValuePair<string, object> badValue = this[2];
this.Remove(badValue);
}
protected virtual void Dispose(bool disposing)
{
if (disposing && Watched)
{
Watched = false;
}
}
private void ReportChange(object sender, NotifyCollectionChangedEventArgs e)
{
Console.WriteLine("Change made: {0}", e.Action);
}
}
Trong khi đó chắc chắn không phải là một chương trình một lớp, phần lớn trong số đó là bản mẫu. Quan trọng nhất, nó không tái thực hiện các ObservableCollection như bạn đã đề xuất; thay vào đó nó hoàn toàn sử dụng nó.
Lý do khiến nó "không thể là một bổ sung tốt cho .NET Framework" là bởi vì khi đã có một cách để làm điều gì đó, việc tạo ra một cách khác để làm điều đó là một ý tưởng tồi. Có ít cách để thực hiện một số công việc cụ thể, ít cách hơn để làm điều đó một cách kém. 8)
Các công cụ được cung cấp, bây giờ tất cả về cách bạn sử dụng chúng.
Hy vọng điều đó sẽ hữu ích!
Có rất nhiều thứ có sẵn trong KeyedCollection không có trong giải pháp của bạn. Ví dụ một người lập chỉ mục dựa trên khóa, ngăn không cho thêm các mục có cùng khóa, vv Vì vậy, mã trên có thể là bản mẫu, nhưng chắc chắn là không hoàn chỉnh. Khuôn khổ là để cung cấp cho chúng tôi các công cụ không chỉ hữu ích để sử dụng, mà còn hoàn thành trong việc thực hiện của họ ... –
Tôi đồng ý với Jeroen. Câu trả lời này không có các khả năng cơ bản của KeyedCollection. Tôi cũng muốn chỉ ra rằng nếu ObservableKeyedCollection được cung cấp bởi khung công tác, thì chúng ta sẽ có những cách ít nhất có thể để làm điều này - 1 - thay vì tất cả mọi người tạo ra giải pháp của riêng họ, nhiều giải pháp sẽ bị hỏng như thế này. – totorocat