【问题标题】:how do i force the converter to execute when the property is changed?更改属性时如何强制转换器执行?
【发布时间】:2011-03-05 06:25:41
【问题描述】:

这是我在 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 ''},这意味着它绑定到数据上下文而不是我要绑定的实际属性。这是必不可少的,因为我正在执行一些逻辑,基于这些逻辑我正在返回图像。

我正在从 web 服务动态下载图像,它返回一个 byte[]。我在课堂上实现了INotifyPropertyChanged。但是,由于我对 DataContext 进行了绑定设置,因此当以异步方式下载 byte[] 时,转换器不会重新执行自身。

【问题讨论】:

    标签: c# silverlight silverlight-4.0


    【解决方案1】:

    将某些东西绑定到它自己的 DataContext 是一个非常糟糕的 idia。现在 Silverligth 4 没有为 DataContext 实现 INotifyPropertyChanged,所以你有两个选择:

    1) 等待 Silverligt 5:

    Silverlight 5–功能列表

    正在引入 DataContextChanged 事件。标记扩展允许在 XAML 解析时为属性和事件处理程序运行代码,从而实现尖端的 MVVM 支持。

    2) 创建一些实现 INotifyPropertyChanged 的​​对象,创建一些属性,然后绑定到该属性...

    【讨论】:

    • @ai :- 我的数据上下文没有改变。更改的是数据上下文中的属性。但是,由于我已绑定到数据上下文而不是数据上下文中的特定属性,因此我遇到了问题。我已经使用 ChangePropertyAction 侥幸逃脱。
    【解决方案2】:

    我相信你只是想要

    {Binding Converter={StaticResource byteArrToBitmap}}

    没有

    {Binding '', Converter={StaticResource byteArrToBitmap}}

    由于不指定任何属性路径将绑定到 DataContext。我不知道{Binding ''} 做了什么,但这不是标准做法。我很惊讶它实际上并没有抛出异常。

    也就是说,我处理这个问题的方法是拥有一个包装对象,它有一个代表字节数组的属性——这样你就可以以更直接的方式引发INotifyPropertyChanged 事件。我相信有一种方法可以使整个对象无效,但我不记得它是什么。

    【讨论】:

    • - {Binding ''} 有效且与 {Binding} 相同。然而,这不是问题的最初关注点。此外,我已经拥有 bytearray 的属性,并且我已经在引发事件。但是我有数据上下文绑定,我没有改变它。
    • @Kar - 您能否展示您的对象并详细说明您如何设置 DataContext、在何处以及如何引发 PropertyChanged 事件等...?
    【解决方案3】:

    我假设您的数据上下文是您要转换的byte[]。因此,您必须确保在异步下载完成时引发 PropertyChanged 事件。此外,请确保在主线程而不是在工作线程或后台线程上引发事件。

    【讨论】:

    • DataContext 不是字节[]。它是Photo 类型的对象。我通过使用ChangedPropertyAction 解决了这个错误。
    【解决方案4】:

    如果您将绑定更改为绑定到某个属性,即使它在您的应用程序范围内是不必要的,您也可以间接导致转换器在该属性更改时重新评估。该属性需要存在于实现 INotifyPropertyChanged 的​​对象上。

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

    【讨论】:

      猜你喜欢
      • 2015-10-03
      • 2020-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-08
      • 1970-01-01
      • 2019-11-16
      • 1970-01-01
      相关资源
      最近更新 更多