首页 新闻 会员 周边

有没有办法将异步方法里创建的对象作为数据源关联到控件上...请指教,谢谢

0
悬赏园豆:30 [已解决问题] 解决于 2013-12-09 14:43
有没有办法将异步方法里创建的对象作为数据源关联到控件上...请指教,谢谢
我将一个异步生成的对象赋给了控件,提示以下异常:
“必须在与 DependencyObject 相同的线程上创建 DependencySourc”
异步调用的方法:
根据异常的提示 创建数据源与创建控件不是同一个线程,所以无法作为其数据源,请问有什么方法使得异步里创建的对象能够作为控件的数据源进行绑定..

//此为异步执行所调用的方法
private void BindBookDetail(object[] bookIds)
{
//所创建的对象
book = DBOperations.BindBookDetail(bookIds[0].ToString());
if (book != null)
{
this.Dispatcher.BeginInvoke(
new BindDataContextDelegate(BindDataContext),
new object[] { book });
}

}


private void BindDataContext(BookDetail bk)
{
try
{
this.ucSp.DataContext = bk; //关联到控件的DataContext上,此处出现如题所述异常...
}
catch (Exception e)
{
Console.WriteLine("******************"+e.Message+"***************************");
}

        
问题补充:

我使用了backgroundworker类,最后在completed事件里赋值时 还是提示一样的异常,我现在把代码贴出来了,麻烦大家帮忙看一下,哪里出问题了,或是用什么方法更好,非常谢谢

private BackgroundWorker bwk;
BookDetail book;

public BorrowReturnBooks()
{
InitializeComponent();
MyInit();
}

private void MyInit()
{
bwk = new BackgroundWorker();

}

//绑定图书信息
private void cb_Executed(object sender,
ExecutedRoutedEventArgs e)
{
string bookId=this.tbxBookId.Text.Trim();

bwk.DoWork+=bwk_DoWork;
bwk.RunWorkerCompleted+=bwk_RunWorkerCompleted;
bwk.RunWorkerAsync(bookId);

//显示提示窗口
tipWin = new ProcessingTip();
tipWin.Show();

this.tbxBookId.Text = string.Empty;
e.Handled = true;
}

private void bwk_DoWork(object sender, DoWorkEventArgs e)
{
string id = (string)e.Argument;
BindBookDetail(id);
}

private void BindBookDetail(string str)
{
book = DBOperations.BindBookDetail(str);

}

private void bwk_RunWorkerCompleted(object sender,
RunWorkerCompletedEventArgs e)
{
this.ucSp.DataContext = book;
}

Tann007的主页 Tann007 | 初学一级 | 园豆:131
提问于:2013-12-05 20:23
< >
分享
最佳答案
0

我使用的方法是 BackgroundWorker

在Dowork里面进行耗时的加载数据操作,放在一个对象里面返回。

在Complete事件里面就可以进行绑定了,这时候是同一个线程。

这个方法给你参考,不要Backgroundworker,也可有有类似的方法的。

收获园豆:10
爱编程的大叔 | 高人七级 |园豆:30839 | 2013-12-06 09:59

除了Backgroundworker 还有何方法,请赐教,谢谢

Tann007 | 园豆:131 (初学一级) | 2013-12-07 12:36

你好 我用了backgroundworker类 还是一样提示同样的异常 我把代码贴出来了 有时间麻烦帮我看一下 谢谢

Tann007 | 园豆:131 (初学一级) | 2013-12-07 13:09
其他回答(2)
0

你将结果赋值给一个变量,然后在异步外再给this.ucSp.DataContext赋值,不就不会报这个错误了

收获园豆:10
幕三少 | 园豆:1384 (小虾三级) | 2013-12-05 22:16

我试过了 我在程序里new了一个对象 然后从异步里创建的对象取值来给new的对象赋值 ,最后再赋给datacontext,结果还是一样提示以上异常

支持(0) 反对(0) Tann007 | 园豆:131 (初学一级) | 2013-12-05 23:05

@Tann007:给 this.ucSp.DataContext赋值不要放在异步里面

支持(0) 反对(0) 幕三少 | 园豆:1384 (小虾三级) | 2013-12-06 08:26

@幕三少: 我把赋值从异步时提出来,出是一样

支持(0) 反对(0) Tann007 | 园豆:131 (初学一级) | 2013-12-07 12:35
0

绑定没有问题,你的赋值方式不对,应该调用控件的invoke方法,然后在里面赋值

收获园豆:10
空明流光 | 园豆:106 (初学一级) | 2013-12-06 07:59

之前试过了调用控件的dispatcher类方法,但是提示一样的异常

支持(0) 反对(0) Tann007 | 园豆:131 (初学一级) | 2013-12-07 12:35

@Tann007: 

参考这个帖子里我的回复,但愿是你的问题:

http://q.cnblogs.com/q/57011/

支持(0) 反对(0) 空明流光 | 园豆:106 (初学一级) | 2013-12-07 12:42

@沧海一杰: 谢谢 我现把代码贴出来了 我用backgroundworker试了一下 还是提示同样的错误,有时间麻烦帮我看一下 谢谢

支持(0) 反对(0) Tann007 | 园豆:131 (初学一级) | 2013-12-07 13:11

@Tann007: 最近太忙其实你的异常一句代码就可以搞定的:

private void BindDataContext(BookDetail bk)
{
try
{

    this.invoke(new MethodInvoker(delegate(){

    this.ucSp.DataContext = bk; //关联到控件的DataContext上,此处出现如题所述异常...

    }));
 
}
catch (Exception e)
{
Console.WriteLine("******************"+e.Message+"***************************");
}

支持(0) 反对(0) 空明流光 | 园豆:106 (初学一级) | 2013-12-13 10:30
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册