我有这个数据网格绑定到可观察的项目集合,如下所示:
<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。
这通常正常,因为显示的数据与集合的值匹配,并且图像列根据属性值正确显示图像。
属性发生变化时出现麻烦。如果我直接在属性上绑定文本列,则在更新属性时内容将更新。但是,通过转换器的图像列将不会收到要更新的通知。
有什么想法吗?
答案 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>