C# 在没有数据绑定的情况下将数据更新到datagrid

C# 在没有数据绑定的情况下将数据更新到datagrid,c#,wpf,.net-4.0,C#,Wpf,.net 4.0,是否可以在不必将数据绑定到特定对象的情况下更新datagrid中的数据,并且仍然享受“双向”数据绑定的好处?在这种情况下,要绑定的对象的类型在运行时根据用户输入确定 更清楚一些: 实际上,我正在使用一个多线程应用程序,我需要从另一个线程更新UI中的数据。为此,我共享一个可观察集合对象的引用,并(通过ItemsSource)将其绑定到数据网格。现在,每当线程更新数据时,它都会调用UI线程中的特定函数,要求它刷新datagrid。当我试图修改网格中的某些值以便将其发送回并行运行的线程时,问题就出现了

是否可以在不必将数据绑定到特定对象的情况下更新datagrid中的数据,并且仍然享受“双向”数据绑定的好处?在这种情况下,要绑定的对象的类型在运行时根据用户输入确定

更清楚一些:


实际上,我正在使用一个多线程应用程序,我需要从另一个线程更新UI中的数据。为此,我共享一个可观察集合对象的引用,并(通过ItemsSource)将其绑定到数据网格。现在,每当线程更新数据时,它都会调用UI线程中的特定函数,要求它刷新datagrid。当我试图修改网格中的某些值以便将其发送回并行运行的线程时,问题就出现了。它引发异常“AddNew或EditItem事务期间不允许使用'DeferRefresh'。

您可以在运行时根据用户输入动态创建代码绑定


除此之外,我不认为有任何方法可以在没有数据绑定的情况下实现双向绑定。一旦丑陋的方法可能是处理itemssource和DataGrid中的数据更改事件,并在事件上更新另一个控件,即itemssource中的数据网格和DataGrid中的itemssource中的值更改时的itemssource,您可以根据用户输入在运行时通过代码手动创建绑定

除此之外,我不认为有任何方法可以在没有数据绑定的情况下实现双向绑定。一种丑陋的方法是处理itemssource和DataGrid中的数据更改事件,并在事件上更新另一个控件,即itemssource中的数据网格和DataGrid中的值更改时的itemssource,在设置(不绑定)itemssource时手动,通过DataGrid的内部实现,绑定自动发生在行和单元格级别。因此,我无法理解我们如何才能不将对象绑定到datagrid并享受它的双向更新

当你设置项目资源时,它们无论如何都会发生。。。或者,您甚至不想设置ItemsSource?

当您设置(不绑定)ItemsSource时,DataGrid的内部实现会自动在行和单元格级别进行绑定。因此,我无法理解我们如何才能不将对象绑定到datagrid并享受它的双向更新


当你设置项目资源时,它们无论如何都会发生。。。或者您甚至不想设置ItemsSource?

使用DataGridView,您可以在运行时更改数据源,并且仍然享受双向绑定。。。只需先将数据源设置为null

如果由于某种原因,你不能做到这一点,你可以考虑对象合成:即将网格绑定到一个中间对象,该对象只为运行时绑定的实际对象保存变量,并为实现创建包装器(ILIST、IListSo源、IbDungLIST或IbdIdItListVIEW)。


除非我遗漏了什么?

使用DataGridView,您可以在运行时更改数据源,并且仍然可以享受双向绑定。。。只需先将数据源设置为null

如果由于某种原因,你不能做到这一点,你可以考虑对象合成:即将网格绑定到一个中间对象,该对象只为运行时绑定的实际对象保存变量,并为实现创建包装器(ILIST、IListSo源、IbDungLIST或IbdIdItListVIEW)。


除非我遗漏了什么?

我目前正在这样做,这需要我在任何地方使用数据。我在想,是否有一种方法可以创建某种基类派生的类层次结构并具有动态绑定(这是正确的术语吗?)扮演if-else结构的一部分。我不知道您的场景的具体细节,但是的,如果与if-else块相比,您可以将各个块正确连接在一起,这将是一个更干净的解决方案。我目前正在这样做,这需要if-else梯形图,无论何时我都需要使用数据。我在想,是否有一种方法可以创建某种基类派生的类层次结构并具有动态绑定(这是正确的术语吗?)扮演if-else结构的角色。我不知道您的场景的具体细节,但如果您能够将各个部分正确连接在一起,与if-else块相比,这将是一个更干净的解决方案。实际上,我使用的是多线程应用程序,我需要从另一个线程更新UI中的数据。为此,我共享一个可观察集合对象的引用,并(通过ItemsSource)将其绑定到数据网格。现在,每当线程更新数据时,它都会调用UI线程中的特定函数,要求它刷新datagrid。当我试图修改网格中的某些值以便将其发送回并行运行的线程时,问题就出现了。它抛出一个异常“AddNew或EditItem事务期间不允许'DeferRefresh'。实际上,我正在使用一个多线程应用程序,需要从另一个线程更新UI中的数据。为此,我共享一个可观察集合对象的引用,并(通过ItemsSource)将其绑定到数据网格。现在,每当线程更新数据时,它都会调用UI线程中的特定函数,要求它刷新datagrid。当我试图修改网格中的某些值以便将其发送回并行运行的线程时,问题就出现了。它引发异常“AddNew或EditItem事务期间不允许'DeferRefresh'