WPF通过转换器绑定数据网格中的图像列,无法在属性更改时更新图像

时间:2011-11-04 21:01:19

标签: c# wpf binding mvvm datagrid

我有这个数据网格绑定到可观察的项目集合,如下所示:

<DataGrid ItemsSource="{Binding Path=MyItems}">

然后,其中一列通过一个简单的转换器绑定到MyItems的属性,该转换器将bool切换到图像路径。

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Image Name="DownloadedIcon" Source="{Binding Converter={StaticResource BoolToImageCheckmark}, ConverterParameter=IsDownloaded, UpdateSourceTrigger=PropertyChanged}" Width="16" Height="16" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

属性本身IsDownloaded完全实现了INotifyPropertyChanged。

这通常正常,因为显示的数据与集合的值匹配,并且图像列根据属性值正确显示图像。

属性发生变化时出现麻烦。如果我直接在属性上绑定文本列,则在更新属性时内容将更新。但是,通过转换器的图像列将不会收到要更新的通知。

有什么想法吗?

5 个答案:

答案 0 :(得分:0)

试试这个:

<DataTemplate>
      <Image Name="DownloadedIcon" Source="{Binding Path=IsDownloaded,Converter={StaticResource BoolToImageCheckmark}}" Width="16" Height="16" />
</DataTemplate>

还在转换器中放置一个断点,以验证绑定是否真正起作用。 请注意,您将通过转换器中的Value参数获取绑定值。

答案 1 :(得分:0)

传递给ConverterParameter的值不会对PropertyChanged通知做出反应。在绑定中使用Path而不是ConverterParameter,然后在转换器的Convert()函数中引用value参数而不是参数参数。

答案 2 :(得分:0)

ConverterParameter不是依赖项属性,因此您无法将其绑定到您尝试执行此操作的属性。您应该将图像源绑定到IsDownloaded属性并转换为:

<DataTemplate>
  <Image Name="DownloadedIcon" Source="{Binding Path=IsDownloaded,Converter={StaticResource BoolToImageCheckmark}}" Width="16" Height="16" />
</DataTemplate>

答案 3 :(得分:0)

转换器类中存在问题。
由于绑定表达式未指定“Path”,因此当前DataContext用作路径,并将DataContext对象作为转换器类中的值。计算正在此datacontext对象的副本上执行。
这种方法将在第一次执行绑定时成功。结果,图像列正确显示图像。
稍后'IsDownloaded'属性更改,它反映在ObservableCollectionClass中,但图像控件无法理解此更改,因为其源属性未绑定到任何集合类属性。类似地,当转换器类接收到datacontext对象的副本时,属性更改也不会反映在转换器类中。
因此,将image source属性设置为集合类属性'IsDownloaded'。此属性发生的任何更改都将触发具有新值的转换器类。


Image Name="DownloadedIcon" Source="{Binding Path=IsDownloaded,Converter={StaticResource BoolToImageCheckmark}}" Width="16" Height="16"/> 

不需要UpdateSourceTrigger。

答案 4 :(得分:0)

实际上,您没有将图像绑定到属性IsDownloaded,而是将它绑定到列表中的整个对象。路径很重要。

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Image Name="DownloadedIcon" Source="{Binding Converter={StaticResource BoolToImageCheckmark}, ConverterParameter=IsDownloaded, Path=IsDownloaded, UpdateSourceTrigger=PropertyChanged}" Width="16" Height="16" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>