一次又一次我发现自己必须编写BindingList和ObservableCollection的线程安全版本,因为当绑定到UI时,不能从多个线程更改这些控件.我想要了解的是为什么会出现这种情况 - 是设计错误还是故意这种行为?
我在过去的两年里开发了一些基于Winforms Application的数据,一切正常.此应用程序构建在层(DataAccess,业务逻辑和UI)上.对于Businness Logic,我的所有对象都继承自一个名为BaseEntity的基类,其定义如下(有一些自定义对象和接口,与框架元素结合):
Run Code Online (Sandbox Code Playgroud)Public MustInherit Class BaseEntity Inherits SerializableObject Implements IEntity Implements IComparer, _ IEditableObject, _ INotifyPropertyChanging, INotifyPropertyChanged, _ IApplicationSecurity End Class
在同一个核心库中,我有一个通用的基本集合BaseEntityCollection.这些集合允许我为每个对象定义他的相关强类型集合,这在基于数据的应用程序中是非常有趣的.这是它的基本定义:
Public MustInherit Class BaseEntityCollection(Of T As BaseEntity)
Inherits BindingList(Of T)
Implements IEntityCollection
Implements INotifyPropertyChanged, INotifyPropertyChanging, ICopyable(Of T)
Implements IDisposable
Implements ISerializable
End Class
Run Code Online (Sandbox Code Playgroud)
如您所见,我使用Winforms中正确数据绑定所需的所有内容:
我也对新技术感兴趣,所以我最近看了一些关于WPF的网络直播.在这些网络广播中,它们用作收集和数据绑定支持ObservableCollection(Of T)的基类.
我正在考虑将我的一些应用程序从Winforms迁移到WPF以用于UI层.
我的问题是,对于我的业务逻辑,最好是基于BindingList(Of T)保留我的集合,还是应该更改我的基本集合类以使其继承自ObservableCollection(Of T).我想为我的所有项目保留一个独特的基础集合,可以在Winforms应用程序,WPF应用程序或ASP.NET中使用.我也在我的项目中使用Linq to Objects,所以我没有限制只保留基于框架2.0的项目.
谢谢,
CLABER
我在我的应用程序中使用绑定列表以及ItemChanged事件.
有什么办法可以知道ItemChanged事件中以前的属性值.目前我正在添加一个名为'OldValue'的独立属性来实现此目的.
有没有办法知道项目更改事件中已删除的项目.我无法找到任何方法来知道哪个项目已从列表中删除.
我正在尝试编写一个可用于我的应用程序的SortableBindingList.我发现了很多关于如何实现基本排序支持的讨论,以便BindingList在DataGridView或其他绑定控件的上下文中使用时进行排序,包括来自StackOverflow的这篇文章:
DataGridView排序和例如.NET中的BindingList <T>
这一切都非常有用,我已经实现了代码,经过测试等等,并且一切正常,但在我的特殊情况下,我需要能够支持对Sort()的简单调用,并让该调用使用默认的IComparable. CompareTo()进行排序,而不是调用ApplySortCore(PropertyDescriptor,ListSortDirection).
原因是因为我有很多代码依赖于Sort()调用,因为这个特定的类最初是从List继承的,最近被改为BindingList.
具体来说,我有一个名为VariableCode的类和一个名为VariableCodeList的集合类.VariableCode实现IComparable,其中的逻辑基于几个属性等适度复杂...
public class VariableCode : ... IComparable ...
{
public int CompareTo(object p_Target)
{
int output = 0;
//some interesting stuff here
return output;
}
}
public class VariableCodeList : SortableBindingList<VariableCode>
{
public void Sort()
{
//This is where I need help
// How do I sort this list using the IComparable
// logic from the class above?
}
}
Run Code Online (Sandbox Code Playgroud)
我在Sort()中重新调整了ApplySortCore方法的尝试失败了,但是阻止我的是,ApplySortCore期望PropertyDescriptor进行排序,我无法弄清楚如何使用IComparable .CompareTo()逻辑.
有人能指出我正确的方向吗?
非常感谢.
编辑:这是基于Marc的回复的最终代码,供将来参考.
/// <summary>
/// Sorts using the default IComparer of …Run Code Online (Sandbox Code Playgroud) 如何将IList<Customer>列表转换为BindingList<Customer>?
我可以通过设置DataSource属性直接将我的DataGridView控件绑定到我的业务对象的绑定列表.我的业务对象实现了INotifyPropertyChanged,因此当新项目添加到绑定列表或更新现有项目时,DGV会更新.
关于处理单个记录,我可以将业务对象绑定到文本框和其他相关控件.
我也可以从BindingList派生并创建一个CustomBindingList类来实现IBindable所需的方法,如下面的链接所述:http: //msdn.microsoft.com/en-us/library/aa480736.aspx
或者,我见过人们建议使用BindingSource.BindingSource的Datasource是业务对象,DGV的DataSource是BindingSource.
无论如何,基于BindingSource并不能为我提供:
那么,为什么推荐BindingSource方法呢?
更广泛的图片:OOPS概念和C#的新手.使用数据库应用程序.的WinForms.到目前为止只使用了DataSet/DataTable方法.现在尝试创建和使用我自己的自定义类.
通常具有主/明细表格.当我单击DGV中的Detail行时,我想在单独的窗口中编辑该记录.所以我需要处理DGV中该行所代表的列表项.试图找到一个解决方案,这让我想到了这一点和这个疑问.
鉴于我想做什么,哪种方法更好,为什么?
这里的一些指示确实会有所帮助,因为我对此非常陌生.
我也在MSDN论坛上问过这个问题... http://social.msdn.microsoft.com/Forums/en/wpf/thread/4493988a-9bd8-48fe-aff0-348502136a80
我需要知道为什么微软建议WPF中BindingList没有正确支持...
BindingList在WPF 中没有用的是什么?我发现它非常实用.到目前为止,我个人没有发现BindingList任何较慢或内存负载较多.
另外WPF ItemsControls,ItemsTemplates,Styles,Hierarchies工作的伟大与BindingList太迟了.他们同样可以观察到.
作为一个自己的核心WPF开发者和ObservableCollection粉丝,我的信念被一个曾经完成的事情所震撼BindingList....
我为什么要使用ObservableCollectionBindingList?(保留INotifyPropertyChanged,它们都必须实现项目属性更改)
我已经DataGridView是必然DataSource的List<myClass>.但是当我将" AllowUserToAddRows"属性设置为"True"时,没有任何东西出现.
我试图改变true到DataSource,它的顺利.
我不知道我是否应该取代我BindingList<myClass>与List<>或有更好的解决方案.
我有一个BindingList(T),我在DataGrid中显示.我正在观察ListChanged事件并在引发ListChanged事件时执行不同的操作.
我正在检查事件的ListChangeType参数以检查列表的更改方式,然后相应地进行响应.但是,我注意到有一个ListChanged事件类型为ItemMoved.
我有"上移"和"下移"按钮,可以在列表中上下移动项目.但这些实际上是删除所选项目,然后将其重新插入更高或更低的位置.
但是,我没有看到BindingList(T)的任何方法,它看起来会移动列表中的项目.所以我错过了一些东西,或者只是没有办法在BindingList中移动一个也会引起ItemMoved类型ListChanged事件的项目?
void FloorCollection_ListChanged(object sender, ListChangedEventArgs e)
{
if (e.ListChangedType == ListChangedType.ItemAdded)
{
//DO STUFF
}
else if (e.ListChangedType == ListChangedType.ItemDeleted)
{
//DO STUFF
}
else if (e.ListChangedType == ListChangedType.ItemMoved)
{
//HOW DO I GET THIS CODE TO RUN?
}
else if (e.ListChangedType == ListChangedType.ItemChanged)
{
//DO STUFF
}
}
Run Code Online (Sandbox Code Playgroud) 如何将BindingList转换为List?
bindinglist ×10
c# ×8
.net ×4
winforms ×4
list ×2
casting ×1
data-binding ×1
datagridview ×1
events ×1
generics ×1
sorting ×1
wpf ×1