C# 为什么我的可观察收集<;T>;我的DataGridView没有观察到吗?

C# 为什么我的可观察收集<;T>;我的DataGridView没有观察到吗?,c#,winforms,data-binding,datagridview,observablecollection,C#,Winforms,Data Binding,Datagridview,Observablecollection,我不得不求助于viewmodel触发一个事件,在捕捉到该事件后,刷新整个网格。当某件事物未被观察到时,它的可观察性又有什么意义呢 以下是may主窗体的启动方式,首先填充网格,然后在每次向集合中添加内容时重新填充网格: private void MainForm_Load(object sender, EventArgs e) { FoundFilesBindingSource.DataSource = ViewModel; // TODO Try get rid of even

我不得不求助于viewmodel触发一个事件,在捕捉到该事件后,刷新整个网格。当某件事物未被观察到时,它的可观察性又有什么意义呢

以下是may主窗体的启动方式,首先填充网格,然后在每次向集合中添加内容时重新填充网格:

private void MainForm_Load(object sender, EventArgs e)
{
    FoundFilesBindingSource.DataSource = ViewModel;

    // TODO Try get rid of event model.
    ViewModel.FilesFound += (o, args) =>
    {
        if (FileInfosGrid.InvokeRequired)
        {
            FileInfosGrid.Invoke(new Action(() => FileInfosGrid.DataSource = ViewModel.FileInfos));
        }
        else
        {
            FileInfosGrid.DataSource = ViewModel.FileInfos;
        }
    };
}
在类
ViewModel
上,
FileInfos
声明为:

public ObservableCollection<FindMatchViewModel> FileInfos { get; set; }
public observeCollection FileInfos{get;set;}

ObservableCollection不适用于dataGridView,因为它没有实现
IBindingList
。您必须使用
绑定列表
。如果要反映对属性的更改,请确保项目实现了
INotifyPropertyChanged

问题是ObservableCollection是为Wpf控件设计的


请注意,
BindingList
不支持对数据进行排序或筛选并反映这一点。此行为仅由DataTable或自定义列表实现支持。

ObservableCollection不适用于dataGridView,因为它未实现
IBindingList
。您必须使用
绑定列表
。如果要反映对属性的更改,请确保项目实现了
INotifyPropertyChanged

问题是ObservableCollection是为Wpf控件设计的


请注意,
BindingList
不支持对数据进行排序或筛选并反映这一点。此行为仅受DataTable或自定义列表实现的支持。

您是否尝试过改用BindingList?请参见所述:•在Windows窗体中,在希望在绑定列表控件中查看数据源更改的场景中(复杂的双向数据绑定),您应该使用实现
IBindingList
作为
DataSource
的类,最合适的实现是
System.ComponentModel.BindingList
一个常见的错误是使用
ObservableCollection
,这将不适用于此要求,因为即使您使用
IBindingList
的实现,它也不会实现
IBindingList
,在为类实现
INotifyPropertyChanged
之前,它不会导致刷新属性。当未观察到某个可观察到的东西时,它有什么意义?这取决于需求和模型的使用。例如,它在WPF中很有用。此外,您还可以依靠
CollectionChanged
事件跟踪客户端上的更改,并将更改的实体推送到服务器进行批量CRUD操作,例如编辑
DataGridView
控件中的项目列表,并将它们全部保存在一个到服务器的请求中。一般来说,如果您的应用程序是没有此类要求的Windows窗体应用程序,我看不出以这种方式使用
ObservableCollection
有任何有用的意义。您是否尝试过使用绑定列表来代替?请参见地址:•在Windows窗体中,在希望在绑定列表控件中查看数据源更改的场景中(复杂的双向数据绑定),您应该使用将
IBindingList
实现为
DataSource
的类,最合适的实现是
System.ComponentModel.BindingList
。一个常见的错误是使用
observateCollection
,因为它没有实现
IBindingList
,因此不适用于此要求如果使用
IBindingList
,则在为类实现
inotifPropertyChanged
之前,不会导致刷新属性。当未观察到时,可观察到的内容有什么意义?这取决于模型的要求和使用情况。例如,它在WPF中很有用。此外,您还可以依靠
CollectionChanged
事件来跟踪客户端上的更改,并将更改的实体推送到服务器,以执行批量CRUD操作,例如编辑
DataGridView
控件中的项目列表,并将它们全部保存在单个服务器请求中。通常,如果您的应用程序是没有此类要求的Windows窗体应用程序,我无法查看以这种方式使用
observedcollection
的任何有用之处。答案中有一些需要更正的地方:•
TreeView
不支持数据绑定,因此它无法绑定到
observedcollection
。•
允许的
默认情况下是
真的
。@RezaAghaei噢,谢谢。想了一下TreeView之所以有效,是因为msdn告诉我们:但我认为它们的意思是WPF TreeView。是的,意思是WPF。答案中有一些地方需要更正:•
TreeView
不支持数据绑定,因此它不能绑定到
可观察集合
。•
允许的
默认情况下是
真实的
。@RezaAghaei哦,谢谢。我认为TreeView是有效的,因为msdn是这么说的:但我认为他们指的是WPF TreeView。是的,指的是WPF。