- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在创建一个可在多种情况下使用的类库 ASP.NET、控制台应用程序、其他类库和 XAML 目标(如 Silverlight 或 WPF)。
最初我决定将集合公开为 IList。但是当使用 XAML 编写示例时,我发现如果我想让绑定(bind)到这些集合变得容易,我需要使用 ObservableCollection。
我有哪些选择?
我可以让库公开 ObservableCollection 并将其强加给与 XAML 无关的用户。这是一件坏事吗?
我可以使我的类通用化,允许调用者指定他们想要的集合类型,只要它实现了 ICollection 可能默认为 Collection
我可以创建一组类,一个使用 ObservableCollection,另一个不使用 Foo 和 ObservableFoo。
我可以在我的类中实现 INotifyCollectionChanged,但当 ObservableCollection 为我实现时,这似乎很愚蠢。
显然,我正在努力保持代码简洁明了,但支持数据绑定(bind)似乎很重要。
有什么建议吗?
编辑:尝试使用这两种选择创建一个可移植类库项目。
在类 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 时,测试项目出现了这个编译错误
The type 'System.Collections.ObjectModel.ReadOnlyObservableCollection`1' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Windows, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes'
因此在这种情况下,使用 ReadOnlyObservableCollection 会强制用户添加对 System.Windows 的引用,这是一个缺点。
编辑:我想出了一个解决方案并发布在我的博客上 - 请参阅 How to make a library portable and data binding friendly at the same time?
最佳答案
好吧,这取决于。如果您正在编写一个纯模型库,那么公开特定于 WPF 的接口(interface)是没有意义的;这将强制用户链接到 WPF 库,即使他们不需要。即使不是,它也会暴露用户不需要的东西,恕我直言,这不是一个好的设计。
如果您的库不限于模型使用,我会将其分为几个部分:所有使用场景所需的核心、具有 WPF 特定接口(interface)的 WPF 相关部分、可能具有 ASP 特定功能的 ASP 特定部分等等在。用户将选择他们需要的部件并使用它们。
编辑:正如@Julien 的评论所述,ObservableCollection<T>
现在作为核心的一部分,因此包括它不会使用户依赖于特定于 WPF 的库。然而,这个想法保持不变。对于 WPF 用法,您通常需要提供/使用特定功能(ObservableCollection
、INotifyPropertyChanged
/DependencyObject
、依赖属性、仅在 UI 线程中通知等)。这意味着它们属于项目的一个单独的、特定于 WPF 的部分。
所以你可以让库由几个部分组成:Library.Core.dll 包含通用/模型开发所需的函数,Library.WPF.dll 处理 WPF 特定的东西并使用 Library.Core.dll,也许是 Library。 Console.dll 和 Library.ASP.dll 也是如此。 WPF用户会用到Library.Core.dll和Library.WPF.dll,控制台程序可能需要Library.Core.dll和Library.Console.dll等。
关于C# 类库集合 ObservableCollection<T> 与 Collection<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11600952/
是否有带有索引的.collect?我想做这样的事情: def myList = [ [position: 0, name: 'Bob'], [position: 0, name: 'J
我创建了一个 Collection 类,它扩展了 ArrayList 以添加一些有用的方法。它看起来像这样: public class Collection extends ArrayList {
我知道如果我有元素,我想得到 List/Set/Map 我可以调用这个元素: Collections.singleton()/Collections.singletonList()/Collectio
我刚刚在我的 pom 文件中看到 Apache commons-collections 有两个不同的组 ID: commons-collections commons-collect
我们可以对所有 Collections 类型的对象(如 Set 和 List)使用 Collections.synchronizedCollection(Collection c),这就是为什么我们有
我有List>我想让它把上一个集合中的所有人复制到List收藏。 我是这样做的: var People = new List>{ new List{...},... };
我想做的是使用良好的旧循环非常简单。 假设我有一个包含 B 列表的对象 A。 public class A { public List myListOfB; } 在其他一些方法中,我有一个 As
在 Capgemini 的采访中,我被问到一个我无法回答的问题。所有集合类和接口(interface)共有的那些方法是什么? 最佳答案 所有 java 对象类(包括所有集合)都派生自名为 Object
我有一系列存储估计信息的数据库表。当设置某些边界时,我试图从所有数据库表中返回所有数据。 收藏 $estimateItems = new Collection(); $esti
为什么 Haskell 实现如此专注于链表? 例如,我知道 Data.Sequence 效率更高 大多数列表操作(cons 操作除外),并且被大量使用; 但是,从语法上讲,它“几乎不受支持”。 Has
我试图简单地将我在 PHP 中请求的内容返回到 JSON。我的问题是每个库存尚未完成。事实上,它是“渲染”,但“this.collection.models”尚未完成,因为请求尚未完成。 我应该如何解
本质上,作为Powershell脚本的一部分,我需要实现广度优先搜索。因此,我需要队列,并且认为System.Collections.Queue与其他任何队列一样好。但是,当我从队列中取出一个对象时,
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是 on-topic用于堆栈溢出。 已关闭10 年前。 Improve t
嗨,我不明白为什么这不起作用? Notifications.update({'userId':Meteor.userId(), 'notifyUserId':notifyFriendId}, {$se
假设我有一个闭包: def increment = {value, step -> value + step } 现在我想遍历我的整数集合的每个项目,用 5 递增,并将新元素保存到一个新集合中:
使用逐页 View 时,我的 plone 集合文件夹未显示所有项目。基本上我有 9 页包含元素,但第 6 - 8 页显示的内容完全相同。因此,并非所有项目都会显示,即使项目总数对应于应该在集合中的元素
private Map> map ,其中 ProgramCourse 是我的项目中的域类,上面的 map 是我运行项目时域类 Program 的字段以下异常即将到来。 Use of @OneToMan
三者的主要区别是什么?现在,我想分别使用字符串/字符串创建一个键/值对。这三个似乎都有我可以使用的选项。 编辑:我只想创建一个简单的哈希表 - 没什么特别复杂的。 最佳答案 通用集合几乎完全取代了基础
我正在为 NodeJs 使用 mongodb 驱动程序,其中有 3 个方法: 1) db.collection.insert 2) 数据库.collection.insertOne 3) db.col
我有一个集合,我正在尝试使用 Distinct 方法删除重复项。 public static Collection imagePlaylist imagePlaylist = imagePlaylis
我是一名优秀的程序员,十分优秀!