这是我在XAML中的图片:
<Image Margin="0"
Stretch="UniformToFill"
Source="{Binding '', Converter={StaticResource byteArrToBitmap}}">
<ToolTipService.ToolTip>
<Border BorderBrush="#FF3D3D3D" Background="#FFFFE1E1">
<TextBlock Text="{Binding PhotoDescription, TargetNullValue=No description}"
Width="170"
Height="Auto"
FontFamily="Georgia"
TextWrapping="Wrap"
Foreground="#FF373737"/>
</Border>
</ToolTipService.ToolTip>
</Image>
此图像位于列表框的DataTemplate中。正如您所看到的,我将源设置为{Binding ''}
,这意味着它绑定到datacontext而不是我想要绑定的实际属性。这是必不可少的,因为我有一些逻辑正在执行,我将返回一个图像。
我正在从webservices动态下载图像,它返回byte[]
。我在课堂上实施了INotifyPropertyChanged
。但是,由于我对DataContext进行了绑定设置,因此在以异步方式下载byte[]
时,转换器不会重新执行。
答案 0 :(得分:1)
将一些东西绑定到它自己的DataContext上是一个很糟糕的错误。现在Silverligth 4没有为DataContext实现INotifyPropertyChanged,所以你有两个选择:
1)等待Silverligt 5:
Silverlight 5功能列表
正在引入DataContextChanged事件。标记扩展允许代码在属性和事件处理程序的XAML分析时运行,从而实现最先进的MVVM支持。
2)创建一些实现INotifyPropertyChanged的对象,创建一些属性,并绑定到该属性......
答案 1 :(得分:0)
我相信你只想要
{Binding Converter={StaticResource byteArrToBitmap}}
不
{Binding '', Converter={StaticResource byteArrToBitmap}}
由于未指定任何属性路径,因此将绑定到DataContext。我不知道{Binding ''}
做了什么,但这不是标准做法。实际上,我很惊讶它没有抛出异常。
那就是说,我要处理的方法是有一个包装器对象,它有一个表示字节数组的属性 - 这样你就可以用更直接的方式引发INotifyPropertyChanged
个事件。我相信有一种方法可以使整个对象无效,但我不记得它是什么。
答案 2 :(得分:0)
我假设您的数据上下文是您要转换的byte[]
。因此,必须确保在异步下载完成时引发PropertyChanged事件。此外,请确保在主线程上引发事件,而不是在工作线程或后台线程上引发事件。
答案 3 :(得分:0)
如果您将绑定更改为绑定到某个属性,即使它在应用程序范围内不必要,您也可以间接导致Converter在该属性更改时重新评估。该属性需要存在于实现INotifyPropertyChanged的对象上。
如果需要,我可以提供源代码。