图片(如果您愿意),Visual Studio 2008 WPF应用程序,其中包含一个包含ListBox的窗口。此应用程序包含一个方法,如下所述,它将ListBox绑定到数据库表的内容。
此应用程序也恰好实现了托管所述WCF服务的WFC服务合同。
下面的数据绑定方法是在窗口上按下按钮并响应针对应用程序托管的WCF服务远程调用的方法时调用的。
当按钮调用时,按下绑定正常工作,列表框反映数据库表的内容。我可以在基础表中插入一些记录,点击按钮,刷新列表框的内容以反映新记录。但是,当通过WCF服务远程触发时,对数据库的任何更改都不会反映在列表框中。从单步执行代码,数据集包含表的正确视图,但列表框保留表的上一个视图,并不反映数据集的内容。
最初我认为这听起来像是一个线程问题,所以我尝试使用Dispatcher对象,但无济于事。根据我的调查,无论如何都会在UI线程上收到这两个调用。
任何建议都表示赞赏 - 知道我的运气可能是一件非常明显的事情......
private void BindData()
{
SqlConnection connection;
using (connection = new SqlConnection(CONNECTION_STRING))
{
DataSet dtSet = new DataSet();
SqlCommand command = new SqlCommand("SELECT * FROM TheTableWithMyStuffIn", connection);
SqlDataAdapter adapter = new SqlDataAdapter();
connection.Open();
adapter.SelectCommand = command;
adapter.Fill(dtSet, "TheTableWithMyStuffIn");
listBox1.DataContext = dtSet;
}
}
UPDATE:我重新实现了远程通知机制以使用远程处理而不是WCF,并且数据绑定现在可以在远程和本地调用时工作。使用WCF必须有一些上下文含义吗?
答案 0 :(得分:2)
您是否尝试过查看.Net 3 / .Net 3.5 / Windows SDK附带的Service Trace Viewer?
可能值得查看弹跳的消息,看看是否有任何东西出现在那里。
祝你好运。修改强>:
您可能想尝试this有关检测静默数据绑定错误的文章......
答案 1 :(得分:0)
鉴于我多年来与.NET没有任何关系,我可能完全离开这里,但到目前为止还没有其他人提供过答案,所以就这样了。
通过快速扫描MSDN文档,了解如何在.NET框架中实现数据绑定,我得到的印象是控件的更新依赖于绑定数据源的属性更改时触发的事件。我注意到,在您提供的代码中,DataContext
的{{1}}属性在通过ListBox
方法检索到数据后为其分配了新的DataSet
。
可能是这样,在已经检索到数据的情况下,某些应该导致Fill
实现更新数据的事件发生得太快了吗?可以假设ListBox
属性的设置足以使其更新;但鉴于在框架的幕后似乎有很多管道,并且DataContext
在不同的上下文中被修改时成功更新,我会开始怀疑漏洞抽象:即,虽然当以一种方式使用时,某些东西按预期工作,当以另一种方式使用时会失败,因为底层管道(虽然不一定有缺陷)不同。
在填充ListBox
之前分配DataContext
属性可能会有所不同。或许这只是一个表面上合理的猜测,但完全而且显然是错误的,只是为了背叛我几乎完全缺乏对.NET内部的了解。
无论哪种方式,祝你好运: - )
答案 2 :(得分:0)
我不确定DataSet
是否实现了适当的接口以自动导致WPF列表框更新,但假设它 ,请尝试这样做:而不是创建一个全新的{ {1}}并将其分配给列表框,尝试从数据库中重新填充相同实例。如果我写这篇文章,我可能会使用DataSet
字段而不是ObservableCollection<T>
,但这意味着您需要将数据移动到DTO或实体中。