如何在属性更改时强制转换器执行?

时间:2011-03-05 06:25:42

标签: c# silverlight silverlight-4.0

这是我在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[]时,转换器不会重新执行。

4 个答案:

答案 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的对象上。

如果需要,我可以提供源代码。