我的UI中需要一个BindingList来提供我的集合和DataGridView之间的双向数据绑定。但是,从业务层(或域层,服务层,数据层等)返回BindingList似乎不正确。也就是说,由于UI要求,我只使用BindingList,现在这个UI需要与我的域层结合。
什么是“适当的”解耦方式?我应该返回IList然后将其复制到BindingList中以进行演示吗?从现实世界的角度来看,这个开销是否有价值?
答案 0 :(得分:2)
没有复制IList(至少我希望你真的不想创建一个副本/克隆)。您通常所做的就是在同一个IList对象上创建另一个引用。所以返回一个IList对象并不是坏事。
你可以返回,例如一个List对象,并从bindingList(位于您的UI中)中引用它。
在我看来,最好返回一个IList(List,HashTable aso)对象而不是BindingList,因为你可以在不同的UI(Console,Web,Win,Service)上使用前者。例如。使用bindingList在Web应用程序中没有任何优势。
答案 1 :(得分:1)
我不知道“正确”的方式是什么,但我过去使用过像CSLA这样的框架,我知道它使用了BindingList,现在是商业列表的ObservableCollection。这使得在UI中使用业务对象变得非常简单,因为UI会在列表中添加或删除项目时更新。如果返回IList然后将其复制到BindingList,则需要手动监视和处理对IList的更改并将其转换为BindingList。我个人的偏好是尽可能使用功能丰富的业务层,它将使用BindingList或ObservableCollection将业务层呈现给UI。
答案 2 :(得分:0)
我认为域图层会返回更通用的类型,是否通知(ObservableCollection<>
)或不通知(IEnumerable<>
或IList<>
)符合要求。
如果需要该功能,UI层可以根据需要(或不)将它们转换为IBindingList。
我们已经成功地使用BindableLinq来实现在UI层通知/同步绑定列表(可能带有过滤器)的目标。
答案 3 :(得分:0)
如果您希望UI元素在不实现自己的事件处理程序的情况下编辑业务模型,那么业务模型必须具有BindingList。
任何时候你做new BindingList<MyWidget>( list )
这样的事情,你就会将绑定与根列表分离。如果一个项目被编辑,它将全部正常工作,但添加和删除将不会反映在原始列表中。
我最近尝试通过点击BindingList ListChanged
事件来实现这样的事情,该事件更新了我的模型以反映BindingList更改,但是如果模型被控制器更改,则它不会更新BindingList用户界面。
您可以为列表生成特殊访问器,每次在列表中添加或删除项时都会引发事件,但这只是重新发明BindingList轮,但开销更大。