我正在创建一个类库,可以在多种情况下使用 ASP.NET、控制台应用程序、其他类库和 XAML 目标,如 Silverlight 或 WPF。
最初,我决定将集合公开为 IList。但是当使用 XAML 编写示例时,我发现如果我想轻松绑定到这些集合,我需要使用 ObservableCollection。
我有哪些选择?
我可以让库公开 ObservableCollection 并将其强加给与 XAML 无关的用户。那是一件坏事?
我可以使我的类通用,允许调用者指定他们想要的集合类型,只要它实现 ICollection 可能默认为 Collection
我可以创建一组类,一个使用 ObservableCollection,一个不使用 Foo 和 ObservableFoo。
我可以在我的班级中实现 INotifyCollectionChanged,但是当 ObservableCollection 为我做这件事时,这似乎很愚蠢。
显然,我试图保持代码简洁明了,但支持数据绑定似乎很重要。
有什么建议么?
编辑:尝试使用两种替代方法创建可移植类库项目。
在班级 Foo 我有
private readonly Collection<string> strings = new Collection<string>();
public ReadOnlyCollection<string> Strings
{
get
{
return new ReadOnlyCollection<string>(this.strings);
}
}
在课堂上 ObservableFoo 我有
private readonly ObservableCollection<string> strings = new ObservableCollection<string>();
public ReadOnlyObservableCollection<string> Strings
{
get
{
return new ReadOnlyObservableCollection<string>(this.strings);
}
}
非常简单的单元测试代码是
[TestMethod]
public void TestMethod1()
{
var foo = new ObservableFoo(); // or new Foo()
Assert.AreNotEqual(0, foo.Id);
Assert.AreNotEqual(0, foo.Strings.Count);
}
唯一的缺点是当我使用 ReadOnlyObservableCollection 时,测试项目得到了这个编译错误
类型“System.Collections.ObjectModel.ReadOnlyObservableCollection`1”在未引用的程序集中定义。您必须添加对程序集 'System.Windows, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes' 的引用
所以在这种情况下,使用 ReadOnlyObservableCollection 会强制用户添加对 System.Windows 的引用,这是一个缺点。
编辑:我想出了一个我在博客上发布的解决方案 - 请参阅如何同时使库可移植和数据绑定友好?