JSON与Silverlight进行数据通信

      学习了TerryLee提供地“一步一步学Silverlight 2系列”后,自已也做了一个DEMO。在此也感谢TerryLee所提供地Silverlight教程。

      但我的例子中,在每次页面重新加载时,都会出现“Sys.InvalidOperationException: ImageError error #4001 in control 'Xaml1': AG_E_NETWORK_ERROR” 异常。也检查了所要加载的图片也是正常的。也借此小标题,跟大家讨论下该问题解决方法。欢迎大家讨论,解决。谢谢!

      源代码: DEMO

posted @ 2008-12-31 11:50 seeker 阅读(361) 评论(3) 编辑 收藏

 回复 引用 查看   
#1楼2008-12-31 13:03 | TerryLee      
问题出在这段代码:
<Canvas x:Name="LayoutRoot" >
<Image x:Name="rect" Stretch="Fill" Canvas.Left="150" Canvas.Top="130" Source="{Binding ProductImage}"
MouseLeftButtonDown="rect_MouseLeftButtonDown_1"
MouseLeftButtonUp="rect_MouseLeftButtonUp_1"
MouseMove="rect_MouseMove_1">
<Image.RenderTransform>
<ScaleTransform x:Name="ZoomScaleTransform"></ScaleTransform>
</Image.RenderTransform>
</Image>
</Canvas>
设置Source属性Binding有问题,你再查一下。

 回复 引用 查看   
#2楼[楼主]2008-12-31 16:16 | seeker      
@TerryLee
如果是Source属性Binding问题的话,为什么我在用以下代码进行绑定也可以呢?
<Image x:Name="rect" Stretch="Fill" Canvas.Left="150" Canvas.Top="130" Source="{Binding ProductImage}"
</Image> 这边绑定不变。服务端代码改成:
Product p = new Product();
p.PinMing = "test";
p.PinPai = "abb";
p.Integral = 20;
p.Price = 20.65;
p.Sort1 = "test";
p.Sort2 = "test";
p.Sort3 = "test";
p.ProductImage = "images/2008-12-16_140756.jpg";
mygrid.DataContext = p;
这样就可以,在页面重新加载不会出现异常。但用WebRequest去请求,就会出现该异常。虽然服务端实现不一样,但两者都是动态绑定image.为什么?

 回复 引用 查看   
#3楼[楼主]2009-01-03 09:15 | seeker      
谢谢大家,也谢谢TerryLee。
关键问题在于绑定发生在设置DataContext之前,所以Image路径还没有设置成你期望的值。
具体源代码修改如下:
在xaml中去掉 Source="{Binding ProductImage}"
private void ResponseReady(IAsyncResult asyncResult)
{
WebRequest request = asyncResult.AsyncState as WebRequest;
WebResponse response = request.EndGetResponse(asyncResult);
using (Stream responseStream = response.GetResponseStream())
{

DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(ProductList));
ProductList productList = jsonSerializer.ReadObject(responseStream) as ProductList;
new Thread(() => {
mygrid.Dispatcher.BeginInvoke(
() =>
{
mygrid.DataContext = productList.Products[0];

Binding binding = new Binding("ProductImage");
rect.SetBinding(Image.SourceProperty, binding);
}

);
}).Start();
}