当使用转换器绑定到Image
的Source
属性时,我遇到了一个特殊的行为。
看来,如果我使用带有IValueConverter
的简单Binding
,该返回对应于图像相对路径的字符串,则一切正常,并且将显示图像。
另一方面,如果我使用带有返回相同字符串的IMultiValueConverter
的MultiBinding
,则绑定不起作用,并且此错误消息显示在VS2010输出窗口中:
我发现要做到这一点System.Windows.Data 错误: 5 : BindingExpression 生成的值对目标属性无效。Value='' MultiBindingExpression:target element is 'Image' (Name='');目标属性为"源"(类型为"图像源")
,我无法返回一个简单的字符串(甚至不能返回Uri
)。相反,我必须在我的转换器中创建一个 ImageSource(实际上是BitmapImage
)并返回它。
你知道为什么会发生这种奇怪的行为吗?这是Binding
和MultiBinding
之间的已知差异,还是错误?
我发现了另一个可能与此相关的堆栈溢出主题,Alvin 在其中发布了有关解决绑定时间的评论:
我认为多重绑定是在 TextBlock 渲染之后进行的,而(单个)绑定是在 TextBlok 渲染之前进行的 – Avlin
为了说明这个问题,我写了一个小项目,你可以下载和测试。
感谢您的任何见解!
我认为这是设计使然,但为了确保您需要询问其中一位开发人员,区别在于没有对返回的值应用类型转换 MultiBindings
,人们经常绊倒。
我的工作原理如下(简化代码!
我的 XAML:
<MediaElement LoadedBehavior="Play" Stretch="UniformToFill">
<MediaElement.Source>
<MultiBinding Converter="{StaticResource ActionMedia_Converter}">
<Binding Path="HomeW_Background_FileName" />
<Binding Path="HomeW_Background_FileType" />
</MultiBinding>
</MediaElement.Source>
</MediaElement>
我的转换器 :
Public Class ActionMedia_Converter
Implements IMultiValueConverter
Public Function Convert(values As Object(), TargetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IMultiValueConverter.Convert
Dim ImageSource As String
ImageSource = String.Concat(values(0), ".", values(1))
Dim MyUri = New System.Uri(ImageSource)
Return MyUri
End Function
Public Function ConvertBack(values As Object, targetTypes As Type(), parameter As Object, culture As CultureInfo) As Object() Implements IMultiValueConverter.ConvertBack
Return Binding.DoNothing
End Function
End Class