首先是我开始的代码:
<ribbon:RibbonMenuButton IsEnabled="{Binding ForegroundIsConfigurable}"
SmallImageSource="{Binding Source={StaticResource imageSource},
Path=Source,
UpdateSourceTrigger=OnPropertyChanged}">
虽然这个绑定在编译和运行时都没有问题,但我不满意的原因是
imageSource
在运行时会发生变化。
由于StaticResource Markup Extension: 通过查找对已定义资源的引用为任何XAML属性提供值。该资源的查找行为类似于加载时查找,它将查找之前从当前XAML页面标记以及其他应用程序源中加载的资源,并将生成该资源值作为运行时对象的属性值。
imageSource
的值在运行时发生了改变,所以我不得不将StaticResource
更改为DynamicResource
。但是Source
属性不是依赖属性,因此以下代码将引发运行时错误:SmallImageSource="{Binding Source={DynamicResource imageSource},
Path=Source,
UpdateSourceTrigger=LostFocus}
因此,我需要直接将动态资源绑定到依赖属性SmallImageSource
:
SmallImageSource="{DynamicResource imageSource}"
这会再次引发运行时错误,因为
imageSource
的类型是Image
。而SmallImageSource
需要该值的类型为ImageSource
。有人可能建议现在将数据上下文设置为我的动态资源并适当地绑定属性。如果我这样做,就会破坏另一个
DataContext
中的IsEnabled
属性绑定。据我所知,
MultiBinding
也不是一种解决方案,因为它提供了一种将属性绑定到多个源的机制,但不提供将不同的属性绑定到不同的上下文和源的绑定。在考虑如何继续之前,我想到幸运的是,我可以将
ImageSource
步骤移动到IValueConverter
中。在我的RibbonMenuButton
的给定数据上下文中,我有一个字符串值与适当的值,实际上也是我的ImageSource
的源。无论如何,我仍然在想,如果我没有其他方法,即如果两个源位于不同的数据上下文中,我将如何解决这个问题。是否有什么我没有注意到的东西?如何确保通过覆盖
DataContext
并尽管绑定到动态资源的属性而不破坏其他绑定?
imageSource
与DrawingImage msdn page上的XAML示例非常相似。<Image x:Key="imageSource">
<Image.Source>
<DrawingImage>
...