标签: bindinglist

为什么BindingList或ObservableCollection这样的类不是线程安全的?

一次又一次我发现自己必须编写BindingList和ObservableCollection的线程安全版本,因为当绑定到UI时,不能从多个线程更改这些控件.我想要了解的是为什么会出现这种情况 - 是设计错误还是故意这种行为?

.net c# bindinglist observablecollection thread-safety

24
推荐指数
3
解决办法
9823
查看次数

ObservableCollection(Of T)vs BindingList(Of T)?

我在过去的两年里开发了一些基于Winforms Application的数据,一切正常.此应用程序构建在层(DataAccess,业务逻辑和UI)上.对于Businness Logic,我的所有对象都继承自一个名为BaseEntity的基类,其定义如下(有一些自定义对象和接口,与框架元素结合):

Public MustInherit Class BaseEntity
    Inherits SerializableObject
    Implements IEntity
    Implements IComparer,  _
               IEditableObject,  _
               INotifyPropertyChanging, INotifyPropertyChanged,  _
               IApplicationSecurity
  End Class
Run Code Online (Sandbox Code Playgroud)

在同一个核心库中,我有一个通用的基本集合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中正确数据绑定所需的所有内容:

  • 对象的INotifyPropertyChanged,INotifyPropertyChanging,IEditableObject.
  • 基于BindingList(Of T)的集合,用于我的集合.

我也对新技术感兴趣,所以我最近看了一些关于WPF的网络直播.在这些网络广播中,它们用作收集和数据绑定支持ObservableCollection(Of T)的基类.

我正在考虑将我的一些应用程序从Winforms迁移到WPF以用于UI层.

我的问题是,对于我的业务逻辑,最好是基于BindingList(Of T)保留我的集合,还是应该更改我的基本集合类以使其继承自ObservableCollection(Of T).我想为我的所有项目保留一个独特的基础集合,可以在Winforms应用程序,WPF应用程序或ASP.NET中使用.我也在我的项目中使用Linq to Objects,所以我没有限制只保留基于框架2.0的项目.

谢谢,

CLABER

data-binding bindinglist observablecollection winforms

23
推荐指数
2
解决办法
2万
查看次数

在BindingList的ItemChanging事件中获取已删除的项目

我在我的应用程序中使用绑定列表以及ItemChanged事件.

有什么办法可以知道ItemChanged事件中以前的属性值.目前我正在添加一个名为'OldValue'的独立属性来实现此目的.

有没有办法知道项目更改事件中已删除的项目.我无法找到任何方法来知道哪个项目已从列表中删除.

c# bindinglist inotifypropertychanged

23
推荐指数
2
解决办法
7915
查看次数

BindingList <T> .Sort()表现得像List <T> .Sort()

我正在尝试编写一个可用于我的应用程序的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)

.net c# sorting bindinglist winforms

21
推荐指数
2
解决办法
3万
查看次数

将IList <T>转换为BindingList <T>

如何将IList<Customer>列表转换为BindingList<Customer>

c# generics casting list bindinglist

17
推荐指数
4
解决办法
4万
查看次数

将bindingsource与bindinglist <business obj>一起用作数据源有什么好处?

我可以通过设置DataSource属性直接将我的DataGridView控件绑定到我的业务对象的绑定列表.我的业务对象实现了INotifyPropertyChanged,因此当新项目添加到绑定列表或更新现有项目时,DGV会更新.

关于处理单个记录,我可以将业务对象绑定到文本框和其他相关控件.

我也可以从BindingList派生并创建一个CustomBindingList类来实现IBindable所需的方法,如下面的链接所述:http: //msdn.microsoft.com/en-us/library/aa480736.aspx

或者,我见过人们建议使用BindingSource.BindingSource的Datasource是业务对象,DGV的DataSource是BindingSource.

无论如何,基于BindingSource并不能为我提供:

  1. 过滤(过滤器不起作用).需要由我提供实施.
  2. 排序和搜索不起作用.需要由我提供实施.

那么,为什么推荐BindingSource方法呢?

更广泛的图片:OOPS概念和C#的新手.使用数据库应用程序.的WinForms.到目前为止只使用了DataSet/DataTable方法.现在尝试创建和使用我自己的自定义类.

通常具有主/明细表格.当我单击DGV中的Detail行时,我想在单独的窗口中编辑该记录.所以我需要处理DGV中该行所代表的列表项.试图找到一个解决方案,这让我想到了这一点和这个疑问.

鉴于我想做什么,哪种方法更好,为什么?

这里的一些指示确实会有所帮助,因为我对此非常陌生.

.net c# bindinglist bindingsource winforms

15
推荐指数
1
解决办法
3万
查看次数

为什么不在WPF中使用BindingList

我也在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,它们都必须实现项目属性更改)

wpf bindinglist observablecollection

14
推荐指数
1
解决办法
9091
查看次数

无法允许用户使用List <> Datasource将行添加到DataGridView

我已经DataGridView是必然DataSourceList<myClass>.但是当我将" AllowUserToAddRows"属性设置为"True"时,没有任何东西出现.

我试图改变trueDataSource,它的顺利.

我不知道我是否应该取代我BindingList<myClass>List<>或有更好的解决方案.

.net c# datagridview bindinglist winforms

13
推荐指数
1
解决办法
1万
查看次数

是什么原因导致BindingList <T>中的ListChangedType.ItemMoved ListChange事件?

我有一个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)

c# events list bindinglist

12
推荐指数
1
解决办法
3766
查看次数

12
推荐指数
1
解决办法
1万
查看次数